Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回相反枚举的优雅方式_Java_Enums - Fatal编程技术网

Java 返回相反枚举的优雅方式

Java 返回相反枚举的优雅方式,java,enums,Java,Enums,我有一个枚举,每个元素都有一个对立面。我想用一种优雅的方式将其封装在枚举的每个元素中。我的首选选项不合法,因为它使用正向引用 enum Direction { NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST); private final Direction opposite; Direction(Direction opposite) { this.opposite = opposite;

我有一个枚举,每个元素都有一个对立面。我想用一种优雅的方式将其封装在枚举的每个元素中。我的首选选项不合法,因为它使用正向引用

enum Direction {
    NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST);

    private final Direction opposite;

    Direction(Direction opposite) {
        this.opposite = opposite;
    }

    public Direction getOpposite() {
        return opposite;
    }
}
使用供应商也是非法的

enum Direction {
    NORTH(() -> SOUTH), SOUTH(() -> NORTH), EAST(() -> WEST), WEST(() -> EAST);

    private final Supplier<Direction> opposite;

    Direction(Supplier<Direction> opposite) {
        this.opposite = opposite;
    }

    public Direction getOpposite() {
        return opposite.get();
    }
}
使用开关:

enum Direction {
    NORTH, SOUTH, EAST, WEST;

    public Direction getOpposite() {
        return switch(this) {
            case NORTH -> SOUTH;
            case SOUTH -> NORTH;
            case EAST -> WEST;
            case WEST -> EAST;
        }
    }
}
或地图:

enum Direction {
    NORTH, SOUTH, EAST, WEST;

    private static final Map<Direction,Direction> OPPOSITES =
        Map.of(NORTH, SOUTH, SOUTH, NORTH, EAST, WEST, WEST, EAST);

    public Direction getOpposite() {
        OPPOSITES.get(this);
    }
}
枚举方向{
北、南、东、西;
私有静态最终映射对立面=
地图(北、南、南、北、东、西、西、东);
公共方向{
相反。得到(这个);
}
}
没有一个替代方案像仅仅将相反的内容作为参数列出那样简单易懂


有没有一种优雅的方法可以避免远期参考问题?

我建议您更改订单:

枚举方向{
北、东、西、南:
...
}
并使用
Direction.values()

公共方向相反(){
方向[]数组=值();
返回数组[(序号()+2)%array.length];
}

不确定是否更好:

enum Direction {
    NORTH("SOUTH"), SOUTH("NORTH"), EAST("WEST"), WEST("EAST");

    private final String opposite;

    Direction(String opposite) {
        this.opposite = opposite;
    }

    public Direction getOpposite() {
        return Direction.valueOf(opposite);
    }
}

聪明的选择,但为什么会超过
values()
?我更喜欢
values()
——只是扫描javadoc太快了。相应地更改了我的答案。依赖枚举中的顺序似乎。。。脆弱的?TBH我更喜欢映射方法。我不确定我是否不同意,但开发人员在盲目添加另一个成员之前需要检查实现实例方法的任何枚举。为什么不在
if..else
中使用multiole或语句?另一种选择是使用
static{..}
初始化块在枚举值已经存在之后设置枚举值,就像在映射选项中一样,这甚至还不错。查找时间也很长。这个问题有点武断和主观,因为标准是
优雅
,不管这意味着什么。就我个人而言,我会使用地图并提供类似公共静态方向#反向(方向)的功能使用私有静态最终映射并使用
guava
ImmutableMap作为映射实现。
switch
语句优于映射的优点是,如果您以后添加另一个枚举值,编译器将告诉您是否忘记更新案例。这在地图上是不会发生的。
enum Direction {
    NORTH("SOUTH"), SOUTH("NORTH"), EAST("WEST"), WEST("EAST");

    private final String opposite;

    Direction(String opposite) {
        this.opposite = opposite;
    }

    public Direction getOpposite() {
        return Direction.valueOf(opposite);
    }
}