我有一个枚举,每个元素都有一个相反的元素。我想要一种优雅的方式将其封装在枚举的每个元素中。我的首选选项不合法,因为它使用前向引用。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用供应商也是非法的。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这让我不得不重写该方法:
enum Direction {
NORTH{
public Direction getOpposite() {
return SOUTH;
}
},
SOUTH{
public Direction getOpposite() {
return NORTH;
}
},
EAST{
public Direction getOpposite() {
return WEST;
}
},
WEST{
public Direction getOpposite() {
return EAST;
}
};
public abstract Direction getOpposite();
}
Run Code Online (Sandbox Code Playgroud)
使用开关:
enum Direction {
NORTH, SOUTH, EAST, WEST;
public Direction getOpposite() {
return switch(this) {
case NORTH -> SOUTH;
case SOUTH -> NORTH;
case EAST -> WEST;
case WEST -> EAST;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者地图:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
没有一个替代方案像只列出相反的参数那样直接或易读。
有没有一种优雅的方法来避免前向引用问题?
我建议你改变一下顺序:
enum Direction {
NORTH, EAST, WEST, SOUTH:
...
}
Run Code Online (Sandbox Code Playgroud)
并使用Direction.values():
public Direction opposite() {
Direction[] array = values();
return array[(ordinal() + 2) % array.length];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |