java enum的若干疑惑

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等。

 

你可能感兴趣的:(java)