欢迎光临
我们一直在努力

枚举 enum,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(处理枚举)

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

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。