java基础-枚举

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值