7

Java は、初期値の序数が 0 であると述べています。次のような列挙を作成すると、次のようになります。

public enum Direction {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...}

TUESDAYの序数は常に 1 で、常に 2の序数WEDNESDAY、...?


もう少し具体的に説明します。私は列挙型を宣言しています:

public enum Direction {UP,RIGHT,DOWN,LEFT}

これで、90 度 (時計回り) に回転させる方法ができました。序数を含む1行です:

direction = Direction.values()[direction.ordinal()+1 % Direction.values().length];

序数を使用しない場合は、switch ステートメントまたは条件を使用する必要があります。

switch (direction) {
    case LEFT:newdirection = Direction.UP;
    break;
  etc...
}

序数を使用することには、いくつかの利点があります。

  • 短いコード
  • より高速なコード (無視できる)
  • 方向が追加された場合(たとえばDOWN_LEFT)、新しい方向を正しい場所に配置すれば、実装を必ずしも変更する必要はありません

どう思いますか?

4

6 に答える 6

8

はい - javadocを参照してください:

この列挙定数の序数を返します (初期定数に序数ゼロが割り当てられている列挙型宣言内の位置)。

于 2012-03-08T14:13:56.467 に答える
7

はい-しかし、誰かがCaturdayを挿入するとコードが壊れるので、コードはそれに依存すべきではありません。

于 2012-03-08T14:14:16.747 に答える
4

はい、ただし、これに依存するとコードが脆弱になります。列挙型の定数の順序を変更したり、それらの間に定数を追加したりすると、一部の定数の序数が変更されます。したがって、たとえば、序数をデータベースまたはファイルに保存することはお勧めできません。ソース コードが変更された場合、データベースまたはファイル内のデータは、変更されたコードと互換性がなくなるためです。

より堅牢な解決策は、各定数にコードを明示的に格納することです。例えば:

public enum Status {
    NEW(0),
    PROCESSING(1),
    OK(2),
    ERROR(99);

    private final int code;

    private Status(int code) {
        this.code = code;
    }

    // Get the code for an enum constant
    public int getCode() {
        return code;
    }

    // Given a code, get the corresponding enum constant
    public static Status fromCode(int code) {
        for (Status s : Status.values()) {
            if (s.code == code) {
                return s;
            }
        }

        throw new IllegalArgumentException("Invalid code: " + code);
    }
}
于 2012-03-08T14:23:12.670 に答える
3

次のようなインデックスを適用することもできます。

enum Direction {
  MONDAY(1),
  TUESDAY(2);
  // etc...

  private int value;    

  private Direction(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}
于 2012-03-08T14:14:42.410 に答える
2

はい。ただし、別の場所で新しい列挙型を並べ替えたり追加したりしたい場合、または既存の値を変更する理由が見つかった場合は、これに依存することは最善の考えではありません。順序値と名前は別として、実際の値/意味を与える方が良いと思います。

于 2012-03-08T14:12:32.293 に答える
1

序数の問題は、列挙値の宣言の順序に依存することです。ある時点で新しい値が列挙に追加され、それが他の値の途中に追加されると、序数が変更され、特定の序数の値に依存するすべてのコードが無効になります。

絶対に序数値に固定数を割り当てなければならない場合、これが役立つかもしれません:

enum Directions {
    NORTH(1),
    SOUTH(2),
    WEST(3),
    EAST(4);
    private int code;
    Directions(int code) {
        this.code = code;
    }
    public int getCode() {
        return code;
    }
}

上記のスニペットでは、code属性が各列挙値に関連付けられており、常に同じ値 (コンストラクターで渡された値) を持つことを確認できます。

于 2012-03-08T14:28:17.207 に答える