枚举类(ENUM)用法总结

对于ENUM一直是比较陌生的,在和某酷爱ENUM的大神合作时,才慢慢接触到ENUM的用法。

1.ENUM是什么?

首先ENUM是一个类,不像String,int之类的数据结构,更类似于一个Class类,只是规定了具体的用法。类似于 Class A implements Enum

比较常见的用法是类似于:

public class ClassEnum { 

CLASSA(1,“A类”);CLASSB(2,“B类”);CLASSC(3,"C类"));
 private int num; 
private String desc; 
Map<int,ClassEnum > allMap; 
public static ClassEnum enumOf(int) 

}

和普通类相似,它继承了Enum类的字段和方法;

跟其他类不同的用法,现在我见到的比较不一样的就是:序列化和反序列化、在数据库操作中的配置

2.ENUM的序列化、反序列化;

Enum的序列化和反序列化有一些比较特殊的规定:

1)在序列化的时候,默认只会返回name属性,对于ClassEnum这个类只会返回CLASSA这个性质。特别是web端通信时,直接返回ENUM类型的字段会拿到name.

2)反序列化时,根据valueOf返回结果

当我们使用enmu来定义一个枚举类型的时候,这个类中有几个属性和方法都是static类型的,因为static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以,创建一个enum类型是线程安全的。

一旦实现了Serializable接口之后,就不再是单例的了,每次调用 readObject()方法返回的都是一个新创建出来的对象。但是,为了保证枚举类型像Java规范中所说的那样,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,在枚举类型的序列化和反序列化上,Java做了特殊的规定。

在序列化时,返回name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的。
编译器的理论可以参考Java中Enum类型的序列化Enum支持序列化吗以及设计模式策略枚举

3.用于mybatis的时候的数据转化;

在mybatis进行转化时候需要配置typeHandler

ClassEnumTypeHandler extends BaseTypeHandle<ClassEnum>{

    public void setNonNummParameters(PreparedStatement Parameter..... );
    ClassEnum getNullableResult(ResultSet resultset,String s);
    ClassEnum getNullableResult(ResultSet resultset,int i );
    ClassEnum getNullableResult(CallableStatement callablement ,int i)

}

mybatis的配置为

<bean id ="sqlSessionFactory" class="org.batis.spring.SqlSessionFactoryBean">
<property ......>
<property id="typeHandlesPackage" value="com.......packageName>

mabatis对于ENUM有默认的typeHandles,

 

 

详细的配置请参考MyBatis学习笔记——自定义TypeHandler(处理枚举)

以上,后续看到会继续补充。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值