1. ホーム
  2. java

[解決済み] Java Enum Methods - 逆方向のenumを返す

2022-05-16 05:19:39

質問

Directionという名前の列挙型を宣言し、その列挙型に反対の方向を返すメソッドを持たせたいと考えています(以下は構文的には正しくありません。) これはJavaで可能ですか?

以下はそのコードです。

public enum Direction {

     NORTH(1),
     SOUTH(-1),
     EAST(-2),
     WEST(2);

     Direction(int code){
          this.code=code;
     }
     protected int code;
     public int getCode() {
           return this.code;
     }
     static Direction getOppositeDirection(Direction d){
           return new Direction(d.getCode() * -1);
     }
}

どのように解決するのですか?

タイトルに惹かれてここに来た人のために: はい、enum に独自のメソッドを定義することができます。そのような非静的メソッドをどのように呼び出すか悩んでいるなら、他の非静的メソッドと同じように行います - そのメソッドを定義または継承する型のインスタンスで呼び出すのです。列挙型の場合、そのようなインスタンスは単に ENUM_CONSTANT s.

つまり、必要なのは EnumType.ENUM_CONSTANT.methodName(arguments) .


さて、質問から問題に戻りましょう。解決策の1つは

public enum Direction {

    NORTH, SOUTH, EAST, WEST;

    private Direction opposite;

    static {
        NORTH.opposite = SOUTH;
        SOUTH.opposite = NORTH;
        EAST.opposite = WEST;
        WEST.opposite = EAST;
    }

    public Direction getOppositeDirection() {
        return opposite;
    }

}

現在 Direction.NORTH.getOppositeDirection()Direction.SOUTH .


もう少しハチャメチャに説明します。 jedwards のコメント が、フィールドを追加したり順序を変えたりするとコードが壊れてしまうので、最初のアプローチほど柔軟性があるとは思えません。

public enum Direction {
    NORTH, EAST, SOUTH, WEST;

    // cached values to avoid recreating such array each time method is called
    private static final Direction[] VALUES = values();

    public Direction getOppositeDirection() {
        return VALUES[(ordinal() + 2) % 4]; 
    }
}