2012-03-08 1 views
6

Javaは初期値の順序が0であると述べているが、私はこのような列挙を作成したときと仮定することができます?Javaの列挙型が1ずつ自動増分すると仮定できますか? 、常に<code>WEDNESDAY</code>の2、<code>TUESDAY</code>の序数は常に1であることを</p> <pre><code>public enum Direction {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...} </code></pre> <p>..:


もう少し詳しく説明します。私は列挙型を宣言しています:

ここでは、時計回りに90度回転する方法があります。これは、序数と1行です:

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

私はswitch文や条件を使用する必要があります序使用することはありません場合は、次の

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

をカップルの利点は序数を使用してあります。

  • 短いコード
  • 高速コード(無視可能)
  • 方向あなたはどう思いますか

あなたは正しい場所に新しい方向性を置けば実装は必ずしも変更する必要はありません(たとえばDOWN_LEFTのために)追加されますか?

+2

(カスタムシリアル化の場合など)問題がある場合は、とにかく明示的なマッピングを行う方がよいでしょう。単に 'EnumMap 'を作成するか、 'Direction'に' int'フィールドを与えてください。 –

+0

私はむしろそれをきれいに保つだろう。これは学校向けですが、技術的にはまだ列挙を使用していません。EnumMapは、まだ配列について学んでいないため、多少の極端である可能性があります。 – Fatso

+0

あなたのクリーン概念は少し間違っています:-)。序数に依拠することは、これをコード化する非常に面倒な方法になります。 –

答えて

7

有り - javadoc参照:

この列挙定数の序数(初期定数はゼロの序数が割り当てられ、その列挙宣言での位置)を返します。

+0

私は理解していません:これは、最初の定数の序数が0であり、2番目の定数が序数1ではなく、3番目の定数が序数2ではないことのみを示しています。 – Fatso

+0

@Korion "そのenum宣言"0から始まるので、MONDAY.ordinal()== 0、TUESDAY.ordinal()== 1など – assylias

+0

私の間違いです。どうもありがとう! – Fatso

2

はい。しかし、新しい列挙体を別の場所で並べ替えたり追加したりしたい場合や、既存の値を変更する理由が見つかった場合は、これに頼ることは最良の方法ではありません。私は、彼らに序数の価値と名前を除いて、実際の価値/意味を与える方が良いと思っています。

+0

申し訳ありませんが、お返事ありがとうございます。上記のような標準的な列挙型を使用しているので、その内容は決して変更されません。私は仮定をしていると思います。 – Fatso

7

はい - 誰かがCaturdayを挿入したときに破損する可能性があるので、あなたのコードはそれに依存してはいけません。

+0

本当ですが、列挙は私の場合は常に同じままです。 – Fatso

+5

@Korion:有名な最後の言葉... –

+0

あなたは正しいです:D。私の列挙は実際には{UP、RIGHT、DOWN、LEFT}ですが、技術的には先生が私にバグを起こしてDOWN_LEFT、UP_RIGHTなどの指示を加えることができると思います。 – Fatso

3

ます。また、このようなインデックスを強制することができます。

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

    private int value;  

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

    public int getValue() { 
    return value; 
    } 
} 
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); 
    } 
} 
1

問題は、列挙型の値の宣言の順序に依存することです。ある時点で新しい値が列挙に追加され、それが他の列の中央に追加されると、順序が変更され、特定の順序値に依存するすべてのコードが無効になります。 code属性が各列挙値に関連付けられている、上記のスニペットで

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

、あなたは確認することができます:あなたは絶対に序の値に固定番号を割り当てる必要がある場合

、これは使用であるかもしれません常にコンストラクタで渡されたものと同じ値を持つことになります。

関連する問題