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

♀尐吖头ヾ 提交于 2019-12-07 12:36:57

问题


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 to me and hope it would also be useful for others who might have the same question in mind.


回答1:


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...)




回答2:


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



回答3:


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



回答4:


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) { }
}



回答5:


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


来源:https://stackoverflow.com/questions/6870710/java-how-can-one-put-to-use-constructor-overloading-in-enums

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!