您好,欢迎来到花图问答。
搜索
您的当前位置:首页关于枚举 (Enum )

关于枚举 (Enum )

来源:花图问答
  • Final 类型的类

枚举类经过编译器编译之后会被添加 Final 修饰,并且继承自 Enum 类 。所以使用 enum 声明的类不能继承别的类也不能被别的类继承,但是可以实现接口

  • 枚举常量

所有成员变量都会被使用 static final 修饰

  • 构造方法

默认的构造方法为 private 修饰的。如果添加构造方法同样必须使用 private 来修饰。并且在 Jvm 层面保证了 构造方法不能被反射取到或者使用。在编译阶段,编译器会为我们自己定义的构造方法添加 name 和 ordinal 两个参数

  • 线程安全

枚举常量都是 static 类型的,在枚举类加载完成后,会进行枚举常量的初始化,之后枚举类无法再实例化和修改。java 的类加载、初始化过程是线程安全的,因此创建一个 enum 是线程安全的。

  • 自有序列化

在序列化的时候 Java 仅仅是将枚举对象的 name 属性输出到结果中,反序列化的时候则是通过 java.lang.Enum 的 valueOf 方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve 等方法;

  • 保证单例

    • 枚举常量为 static 修饰的,并且因为类加载是线程安全的,所以不会被重复创建;
    • 枚举类内部重写了 clone() 方法,保证里不能被使用 clone 来创建对象
    • Jvm 限制了使用反射获取构造方法
    • 重写 readObject() 方法 , 保证不能被反序列生成对象

附一个单例的写法:

public classResource{ }

public enum SomeThing { 

  INSTANCE;
  private Resource instance; 

  private SomeThing() { 
    instance = newResource();
   } 

  public Resource getInstance() {
   return instance; 
  } 
}


Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务