java枚举类

应用场景

枚举用来表示一类值域范围有限的值,比如状态、性别等。java枚举值可以把每个值实例化成一个对象,为每个对象指定多个属性,方便维护管理。

优点:

  • 按值实例化,每个实例可以指定多个属性以及实现抽象方法,方便维护和扩展
  • 安全,java枚举类使用final修饰,不能被继承,实例均为static final修饰,构造器只能为私有,且在jvm层面限制不能被反射获取,天生有利于构造单例对象

使用注意点

1、java枚举类均继承自java.lang.Enum,故无法继承其他类,但可以实现多个接口
2、所有实例定义均要写在类起始处
3、实例的多个属性与构造器相呼应,属性一般定义为private,构造器只能为private

   PLUS(1, "加法"){
       @Override
       public Integer calculate(int a, int b){
           return a + b;
       }
   };
   
   private Integer code;
   private String name;
   CalculationEnum(Integer code, String name) {
   	this.code = code;
   	this.name = name;
   }
   
   abstract Integer calculate(int a, int b);

4、 通过字节码反编译,可确认实例均为static final修饰
5、枚举类中可以定义抽象方法,每个实例可以通过匿名内部类方式实现方法,如下。

	PLUS(1, "加法"){
        @Override
        public Integer calculate(int a, int b){
            return a + b;
        }
    };
    abstract Integer calculate(int a, int b);

6、实例的name()方法返回实例名,如上面加法实例返回 “PLUS”
7、枚举类的values()方法可以返回所有实例对象,values方法由编译器生成。
8、枚举类的valueOf()可以根据实例的name()方法获取实例对象
9、枚举类可以方便、安全的实现单列模式(推荐使用)

	public enum Singleton {
		INSTANCE;
	}

如上就可以实现一个安全的单例,通过Singleton.INSTANCE即可获取使用。如下所述,由于jvm限制了enum类的构造器无法被反射以及反序列化创建实例,因此更加安全。

It is a compile-time error to attempt to explicitly instantiate an enum type (§15.9.1). The final clone method in Enum ensures that enum constants can never be cloned, and the special treatment by the serialization mechanism ensures that duplicate instances are never created as a result of deserialization. Reflective instantiation of enum types is prohibited. Together, these four things ensure that no instances of an enum type exist beyond those defined by the enum constants.

总结

java枚举类就是封装、高内聚的设计思想完美呈现。既然是枚举,就限制了只能为某单一使用场景,因此最重要的就是功能单一,对外暴露的功能越少越好,所以就有了如此多的final以及jvm层面的限制,这也构成了其安全属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值