1. 介绍
每一个枚举类型及其定义的枚举变量在JVM中都是唯一的
2. 示例
@RequiredArgsConstructor
@Getter
public enum OperationTypeEnum {
ADD("insert", "添加操作"),
UPDATE("update", "更新操作"),
DELETE("delete", "删除操作"),
SELECT("select", "查询操作");
private final String code;
private final String message;
}
3. 阿里规约
【参考】枚举类名带上Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。
正例:枚举名字为ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。
【推荐】使用枚举值来指代月份。如果使用数字,注意Date,Calendar 等日期相关类的月份
month 取值在 0-11 之间。
说明:参考JDK 原生注释,Month value is 0-based. e.g., 0 for January.
正例:Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH 等来指代相应月份来进行传参或比较
【强制】所有的枚举类型字段必须要有注释,说明每个数据项的用途。
【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚
举类型或者包含枚举类型的POJO 对象。
A 系统使用枚举作为返回值 B 调用A反序列化
A:新增了一个枚举属性,B不知道
反序列化 非法参数异常
3. 序列化
在序列化时Java仅将枚举对象的name属性输出到结果中,反序列化时则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。
同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、
readObject、readObjectNoData和writeReplace和readResolve等方法。
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
2. 实现一个或多个接口
@RequiredArgsConstructor
@Getter
public enum BasicOperation implements Operation {
/**
*枚举变量自己的方法
*/
PLUS("+"," 加法 "){
@Override
public Double operate(Double x, Double y) {
return x-y;
}
},
MINUS("-"," 减法 ");
private final String symbol;
private final String name;
/**
* 属于 所有的枚举 变量 相当于 枚举的默认实现
* @param x
* @param y
* @return
*/
@Override
public Double operate(Double x, Double y) {
return x+y;
}
}
3. 枚举实现的单例是天生线程安全的。
static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用时静态资源被初始化,Java类的加载和初始化过程都是线程安金的,因为虚拟机在加载枚举的类时,会使用ClassLoader的loadClass方法,而这个方法使用同步代码块保证了线程安全。所以,创建一个enum类型是线程安全的。也就是说,我们定义的一个枚举在第一次被真正用到时,会被虚拟机加载并初始化,而这个初始化过程是线程安全的。而我们知道,解决单例的并发问题,主要解决的就是初始化过程中的线程安全问题。
由于枚举的以上特性,枚举实现的单例是天生线程安全的。
public enum T{
SPRING,SUMMER,AUTUMN,WINTER;
}
--------------------------------------------------------------------------------------------------------------------------------
反编译后
----------------------------------------------------------------------------------------------------------------------------------
public final class T extends Enum
1省略部分内容
Public static final T SPRING;
public static final T SUMMER;
public static final T AUTUMN;
public static final T WINTER;
private static final T ENUMSVALUES[];
static
{
SPRING = new T("SPRING",0);
SUMMER = new T("SUMMER",1);
AUTUMN = new T("AUTUMN",2);
WINTER = new T("WINTER",3);
ENUM$VALUES (new T[]{
SPRING,SUMMER,AUTUMN,WINTER
});