- 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;
}
}