2011-07-29 74 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