1.关键字enum与java.lang.Enum 是什么关系?
任何enum常量都是Enum的子类
2.为什么自定义的enum类型 不能继承其他类?
因为1的原因,每个enum都是Enum的子类,而java又不支持多重继承,所以自定义的enum类型不能再继承其他类。
3.为什么自定义的enum的构造函数必须是private?
因为enum的实例是固定的,你不能随便构建enum的实例,否则就失去枚举的意义了,因此其构造函数必须是private,而且实例的声明必须在私有构造函数的前面。看code:
public enum Color{
BLUE,RED,YELLOW;
private Color(){//ok
}
public Color(){//error
}
}
4.如何修改枚举对应整数的开始值?
默认enum的开始值是0,而很多情况这不符合我们的预期,比如我想让表示状态的枚举从1开始,该怎么做?
一种做法:
public static enum STATUS{
NEW(1), FAILED(2), DOWNLOADED(3),PARSERED(4);
private int code;
private STATUS(int c){
code = c;
}
@Override
public String toString() {
return String.valueOf(this.code);
}
public int getCode(){
return code;
}
}
Enum的很多方法都是final的,即不能被override。toString方法是个例外,但对于解决这个问题override toString方法不是正确做法,除非你每次希望用这样的code来获得枚举的int值:
Integer.valueOf(STATUS.NEW.toString()); 显然比较别扭。
其实只要提供一个类似上面的get方法就好了。
5.如果索引值不是从0开始,那么不要使用ordinal方法获得对应的int
因为你没法override ordinal方法。其实最好不要使用ordinal方法,因为按照ordinal方法javadoc的说明,这个方法只是为那些使用基于枚举的复杂数据结构而提供的,比如EnumSet,EnumMap等。