java - 返回相反枚举的优雅方式
问题描述
我有一个枚举,每个元素都有一个相反的元素。我想要一种优雅的方式将它封装在枚举的每个元素中。我的首选选项不合法,因为它使用前向引用。
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{
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();
}
使用开关:
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);
}
}
没有任何一种选择像仅仅列出相反的论点那样简单易读。
有没有一种优雅的方法来避免前向引用问题?
解决方案
我建议你改变顺序:
enum Direction {
NORTH, EAST, WEST, SOUTH:
...
}
并使用Direction.values()
:
public Direction opposite() {
Direction[] array = values();
return array[(ordinal() + 2) % array.length];
}
推荐阅读
- sql-server - 如何选择未聚合或包含在 GROUP BY 中的额外信息?详细示例
- python - 如何安装 httplib2 库 - 运行安装时出错
- r - 如何在 data.table 中进行更快的列表列操作
- typescript - 为什么 TypeScript 编译器不会抱怨与形状不匹配的对象?
- python - 使用 OpenCV 提高用稀释墨水书写的几乎不可见的旧文本的对比度和质量
- visual-studio - 尽管包含正确的 INCLUDE 文件,但 MKL DFT 未解析的外部符号
- python - 如何让 Mypy 意识到 isinstance 已经被调用?
- java - 需要什么来转换 JPanel 和 JButton 以与 IOS 一起工作,避免“无头”错误?
- pyqt5 - AttributeError:“QHoverEvent”对象没有属性“x”
- python - 如何使 Python REGEX 匹配表达式的第一次出现 - 它现在扩展到第二次