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;
}
}
}
精彩评论