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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值