gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:47:32 26 4
gpt4 key购买 nike

我注意到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com