Java列挙型ドキュメントに通常のメソッドが記載されていることに気付きました。
この列挙定数の序数を返します(列挙宣言内の位置。初期定数にはゼロの序数が割り当てられます)。ほとんどのプログラマーは、この方法を使用できません。これは、EnumSetやEnumMapなどの高度な列挙型データ構造で使用するために設計されています。
ordinal
配列にインデックスを付けるために使用するのではなく、EnumMap
代わりに使用することを提案するオンラインのすべての例を理解しています。特に効果的な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
ます。
ただし、序数を使用するのは良い習慣ではないことを知っているので、コードサイズを抑えて読みやすさを維持しながら、これを行うためのより良い方法があるかどうか疑問に思いました。
アドバイスをいただければ幸いです。