【发布时间】:2013-01-24 01:07:28
【问题描述】:
我注意到Java Enum Documentation 声明了序数方法:
返回此枚举常量的序号(它在枚举声明中的位置,其中初始常量的序号为零)。大多数程序员都不会使用这种方法。它设计用于复杂的基于枚举的数据结构,例如 EnumSet 和 EnumMap。
我了解所有在线示例,建议不要使用 ordinal 来索引数组,而是使用 EnumMap。特别是Item 33 of Effective Java
但我的问题是:可以在我的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() 以便我可以循环浏览方向(并返回下一个相关方向)。例如。从 NORTH 旋转 90 度将返回 EAST。
但是我知道使用序数并不是一个好习惯,所以我想知道是否有更好的方法来做到这一点,同时仍然保持代码大小和可读性。
如果您有任何建议,我将不胜感激!
【问题讨论】: