2011-07-29 61 views
3

我正在使用Java中的枚舉。正如我所看到的,可以重載一個枚舉構造函數。我的問題是,根據我的理解,既然有可能既不能自己調用​​它,也不能迫使編譯器調用你想要調用的特定調用,否則在這種情況下有可能從構造函數重載中受益。Java:如何在枚舉中使用構造函數重載?

升值的時候你拿澄清的東西給我,希望它也將是其他人誰可能在考慮同樣的問題非常有用。

回答

14

稱之爲 - 設置枚舉值時。例如:

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最好的特性之一 - 肯定是我在Java中使用C#時錯過的幾件事情之一。 (它們可以更整齊實現,我敢肯定,但是......)

+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

謝謝,鮑里斯 - заподробныйответ) – akhilless

0

有鄰使用構造函數的方式得到它是相當的整數值枚舉?目前我有這樣的代碼,但是這個很長的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或者一個普通的List比使用枚舉要好。 – akhilless