Iは気づくことJava Enum Documentation状態序方法:使用は、
この列挙定数の序数(初期定数の序数が割り当てられ、その列挙宣言、その位置を返しゼロ)。ほとんどのプログラマーはこのメソッドを使用しません。 EnumSetやEnumMapなどの洗練されたenumベースのデータ構造で使用するように設計されています。
は、私は配列のインデックスへ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];
}
}
あなたは私が序()を使用しています見ることができるように私ができるように、方向を循環(および次の関連する方向を返す): は、たとえば私のコードは次のとおりです。例えば。 NORTH
から90度回転すると、EAST
が返されます。
しかし、序数を使用するのは良い方法ではないことがわかっているので、コードサイズを小さくして可読性を維持しながら、これを行うより良い方法があるかどうかは疑問でした。
アドバイスをいただきありがとうございます。
効果的なJavaを慎重に読んでいれば(項目31)、実際には、新しい要素を列挙型に追加することができないため、このようにordinalを使用することは勧められます。この場合も、WEST_FAR_AWAY(-10、0)要素によってコードが中断されます。だから、ジョシュア・ブロッホはこのコードを承認しないでしょう。これはすばやく汚れた解決策です。それはOK(作業中)ですが、最高です。 – lbalazscs
@ibalazscs - この場合、新しい 'enum'を追加することは意味をなさないでしょう。あなたのWEST_FAR_AWAYは全く意味をなさないでしょう。 – OldCurmudgeon
私はそれが理にかなっている多くのシナリオを考えることができます。例えば、移動メソッドはオフセットを使用し、異なるオフセットを持つ方向を使用して高速に動くものを実装することができます。または、何らかの理由でSOUTH_WESTを削除する必要があります。これは、この脆弱なコードを破ることにもなります。 – lbalazscs