我注意到Java 枚举文档说明了序数方法:
返回此枚举常量的序号(它在其枚举声明中的位置,其中初始常量的序号为零)。大多数程序员不会使用这种方法。它设计用于复杂的基于枚举的数据结构,例如 EnumSet 和 EnumMap。
我了解所有在线示例,这些示例建议不要使用ordinal
索引来索引数组,而是使用索引EnumMap
。特别是 Effective Java 的第 33 条Enum
但我的问题是:可以在我的定义
中使用它吗?例如我的代码如下:
public enum Direction {
NORTH(0, 1), NORTH_EAST(1, 1), EAST(1, 0), SOUTH_EAST(1, -1),
SOUTH(0, -1), SOUTH_WEST(-1, 1), WEST(-1, 0), NORTH_WEST(-1, 1);
private final int xOffset;
private final int yOffset;
private final static int DEGREES = 360;
private Direction(int xOffset, int yOffset) {
this.xOffset = xOffset;
this.yOffset = yOffset;
}
public Position move(Position position) {
return new Position(position.getX() + xOffset, position.getY() + yOffset);
}
public Direction rotate(int degrees) {
int length = Direction.values().length;
int index = (ordinal() + (degrees / (DEGREES / length))) % length;
return Direction.values()[index];
}
}
如您所见,我正在使用 ordinal() 以便我可以循环浏览方向(并返回下一个相关方向)。例如,旋转 90 度NORTH
将返回EAST
。
但是我知道使用序数不是好的做法,所以我想知道是否有更好的方法来做到这一点,同时仍然保持代码大小和可读性。
我会非常感谢任何建议!