2011-07-29 9 views
3

私はJavaで列挙を扱っています。私が見るとおり、列挙コンストラクタをオーバーロードすることは可能です。私の質問は、コンストラクタのオーバーロードがこの文脈で可能であるということです。コンパイラにあなたが呼びたい特定のものを呼び出さないようにすることは、自分自身でもそれを呼び出すこともできないということを理解している限りです。Java:どのようにして、列挙型でコンストラクタのオーバーロードを使用することができますか?

私はそのことを明らかにするために時間をとっていただき、同じ質問を念頭に置く他の人にとっても役立つことを願っています。

答えて

14

You do enum値を設定するときに呼び出します。例:

public enum Person 
{ 
    FRED("Frederick", "Fred"), 
    PETE("Peter", "Pete"), 
    MALCOLM("Malcolm"); // No nickname 

    private final String nickname; 
    private final String name; 

    private Person(String name, String nickname) 
    { 
     this.name = name; 
     this.nickname = nickname; 
    } 

    private Person(String name) 
    { 
     this(name, name); // Just use the name as the nickname too 
    } 

    // getNickname and getName 
} 

これまでさまざまなプロジェクトでこの機能を使用してきました。列挙型はJavaの最もすばらしい機能の1つです。確かに、C#で作業するときにJavaから逃した数少ないものの1つです。 (彼らもよりきれいに実装することができ、私は確信している、しかし...)

+0

申し訳ありませんが、もう一度私が戻ってくるのは時間がかかりました。優れた答え、あなたの時間を感謝、ジョン。 – akhilless

2

はい、あなたは、コンストラクタのオーバーロードを使用することができます。

public enum SomeEnum { 
    VALUE1("foo"), 
    VALUE2("bar", "baz"); 

    public final String v1; 
    public final String v2; 

    SomeEnum(final String v) { 
    this(v, v); 
    } 

    SomeEnum(final String v1, final String v2) { 
    this.v1 = v1; 
    this.v2 = v2; 
    } 
} 
2

あなたが列挙型「定数」を定義するときは、コンストラクタを使用します

enum Eg { 
    ZERO, ONE(1), TWO(2,2); 

    Eg() { this(0); } 
    Eg(int i) { this(i, 0); } 
    Eg(int i, int j) { } 
} 
3

さらに完全な例:

public enum EnumTest { 
    NO_ARGS, 
    FIRST_ARG("initialized string"), 
    SECOND_ARG(5), 
    BOTH_ARGS("first", Integer.MAX_VALUE); 

    private final String one; 
    private final int two; 

    private EnumTest() 
    { 
    this.one = ""; 
    this.two = 2; 
    } 

    private EnumTest(String one) 
    { 
    this.one = one; 
    this.two = 0; 
    } 

    private EnumTest(int two) 
    { 
    this.one = ""; 
    this.two = two; 
    } 

    private EnumTest(String one, int two) 
    { 
    this.one = one; 
    this.two = two; 
    } 
} 
+1

ありがとう、Boris - заподробныйответ) – akhilless

0

はOでコンストラクタを使用する方法はありますrderはその列挙型を等価の整数値から取得するか?現在、私はそのようなコードを持っていますが、この長いswitch文はあまり簡潔ではありません。

ZoneGroup zoneGroup = ZoneGroup.get(loader.getId()); 

public static enum ZoneGroup { 
    ANDROID_NOTABLE(0), ANDROID_TOP(1), ANDROID_ALL(2), ANDROID_NEAR(3), ANDROID_FAV(4), UNDEFINED(5); 

    private final int value; 

    ZoneGroup(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 

    public static ZoneGroup get(int value){ 
     switch (value) { 
     case 0: 
      return ANDROID_NOTABLE; 
     case 1: 
      return ANDROID_TOP; 
     case 2: 
      return ANDROID_ALL; 
     case 3: 
      return ANDROID_NEAR; 
     case 4: 
      return ANDROID_FAV; 
     default: 
      return UNDEFINED; 
     } 
    } 
} 
+0

答えとして投稿するのではなく、あなた自身の質問を始めた方がいいと思います。あなたの質問にもっと注意を払うでしょう。また、私はこの場合、HashMap、または普通のリストでもenumを使うよりも良いと信じています。 – akhilless

関連する問題