java - 在 Java 枚举定义中使用序号

标签 java enums ordinal

我注意到 Java Enum Documentation陈述序数法:

Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as EnumSet and 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

但是我知道使用序号不是好的做法,所以我想知道是否有更好的方法来做到这一点,同时仍然保持代码大小并保持可读性。

如果有任何建议,我将不胜感激!

最佳答案

我会说这是对 ordinal 的完全可接受的使用。事实上,在我看来,它非常简洁明了。

关于在您的enum 代码中不使用ordinal 的评论只是为了阻止您这样做,因为大多数时候您可以使用enum 本身或 EnumMap 代替。

您对 EffectiveJava 的引用警告您不要这样做,因为选择正确的 int 用作数组的偏移量是令人担忧的,而且通常是不必要的。在您的情况下不适用,因为 a) 您做得正确,并且 b) 这是实现您正在寻找的功能的最简单方法。

关于java - 在 Java 枚举定义中使用序号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14769655/

相关文章:

enums - 如何创建一个获取枚举类型值的宏?

java - 以可读的方式使用枚举

r - 求序数中位数的惯用方法

java - 无法生成字符串的所有排列(迭代)

java - 为什么 Swarm 注册 "jpa"、 "undertow"缓存容器

java - 使用 Jackson 将 Double 序列化到小数点后 2 位

java - gwt 托管模式在连接到 127.0.0.1 时挂起

c++ - 带有 std::if_enabled_t 参数的模板函数的完全特化

python - 序数数据集

c# - 真假值的字符串比较 OrdinalIgnoreCase