2013-10-25 31 views
29

基本的に私が行ったことは、州の列挙型を記述することだけであり、州としてもアクセスできるだけでなく、省略形や元のコロニーにアクセスできるようにしたい。複数の値型を持つJava enum

public enum States { 
     ... 
     MASSACHUSETTS("Massachusetts", "MA", true), 
     MICHIGAN("Michigan",   "MI", false), 
      ...; //so on and so forth for all fifty states 

     private final Object[] values; 

     States(Object... vals) { 
      values = vals; 
     } 

     public String FULL() { 
      return (String) values[0]; 
     } 

     public String ABBR() { 
      return (String) values[1]; 
     } 

     public boolean ORIGINAL_COLONY(){ 
      return (boolean) values[2]; 
     } 
    } 

これは私が期待するように動作するようです。 I列挙型を含む、この特定のシナリオのためにすることができます

System.out.println(States.ALABAMA);     // Prints "ALABAMA" 
System.out.println(States.ALABAMA.FULL());   // Prints "Alabama" 
System.out.println(States.ALABAMA.ABBR());   // Prints "AL" 
System.out.println(States.ALABAMA.ORIGINAL_COLONY());// Prints "false" 

、これはこれを行うか、セットアップへのより良い方法があると、この列挙型をフォーマットするための最良の方法ですか?すべてのおかげで、事前に!

+5

方法はすべて大文字であってはなりません。 –

+0

列挙型ではありませんか?通常は私はラクダのケースを使用しますが、決して変更されない静的なものを参照するときは、enum自体のようにすべて大文字にする必要があります。 –

+5

'name'、' abbreviation'、 'isOriginalColony'のようなフィールドを実際に持ち、'(String、String、boolean) 'を取るコンストラクタを持っていた方が良いでしょう。そうすれば、より読みやすくなり、別の状態で引数を間違った順序で追加することを防ぐことができます。 –

答えて

66

まず、enumメソッドをすべて大文字にする必要はありません。それらは同じ命名規則を持つ他のメソッドと同様のメソッドです。

第2に、あなたがしていることは、あなたの列挙を設定する最良の方法ではありません。値に値の配列を使用する代わりに、各値に別々の変数を使用する必要があります。他のクラスと同じようにコンストラクタを実装することができます。ここで

は、あなたが上記のすべての提案とそれを行う必要があります方法は次のとおりです。

public enum States { 
    ... 
    MASSACHUSETTS("Massachusetts", "MA", true), 
    MICHIGAN  ("Michigan",  "MI", false), 
    ...; // all 50 of those 

    private final String full; 
    private final String abbr; 
    private final boolean originalColony; 

    private States(String full, String abbr, boolean originalColony) { 
     this.full = full; 
     this.abbr = abbr; 
     this.originalColony = originalColony; 
    } 

    public String getFullName() { 
     return full; 
    } 

    public String getAbbreviatedName() { 
     return abbr; 
    } 

    public boolean isOriginalColony(){ 
     return originalColony; 
    } 
} 
+0

@Marcinなぜそれはプライベートではありませんか? – tbodt

+0

列挙型コンストラクタは暗黙的にプライベートです –

関連する問題