开发者

Java: How can one put to use constructor overloading in enums?

I am working with enumerations in Java. As I can see, it is possible to overload an enumeration constructor. My question is it possible at all to benefit from constructor overloading in this context given that as far as I understand it is possible neither to call it by yourself no to force the compiler to call a particular one that you would like to call?

Appreciate the time your take to clarify that stuff 开发者_StackOverflow中文版to me and hope it would also be useful for others who might have the same question in mind.


You do call it - when setting the enum values. For example:

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
}

I've used this ability for various projects in the past. Enums are one of Java's nicest features - certainly one of the few things I miss from Java when working in C#. (They could be implemented even more neatly, I'm sure, but...)


Even more complete example:

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;
  }
}


Yes, you can use constructor overloading:

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;
  }
}


You use the constructor when you define your enum "constants"

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

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


Is there a way to use constructor in order to get enum from it's equivalent integer value? Currently I have such code, but this long switch statement is not very concise.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜