功能:枚举类型有一种很给力的应用。如:最常见的审批流程(新建,审核中,审核通过)。在web开发时,页面显示的是审核中,审核通过这样的汉字。而数据库存储的往往是1(代表新建)这样的数字类型。这样做的好处是数据库存储方便,使用的空间小。然而为了增强代码的可读性,在实际代码中我们采用NEW,CHECKING,CHECKED这样的字段。Enum完美解决了这个问题。
例:
1.1实现类
public enum FlowStatus implements EnumPersistable<FlowStatus>{
NEW(1,"新建"),CHECKING(2,"审核中"),CHECKED(3,"审核通过");
private int val ;//存储
private String desc;//显示
private FlowStatus(int val,String desc) {
this.val = val;
this.desc=desc;
}
public String getDesc() {
return desc;
}
public Integer getVal(){
return val;
}
@Override
public FlowStatus getEnumVal(Integer val) {
switch(val) {
case 1:
return NEW;
case 2:
return CHECKING;
case 3:
return CHECKED;
}
return null;
}
@Override
public Integer getPersistVal() {
return this.val;
}
}
1.2接口:
public interface EnumPersistable<T extends Enum<?>> {
Integer getPersistVal() ;//获取val,存入数据库的数值
T getEnumVal(Integer val);//获取相对应的枚举类型,代码中应用的值
}
1.3Model类
@Table(name = "CONTRACT")
public class Contract implements Serializable {
private FlowStatus status; //合同状态
@Column(name="CONTRACT_STATUS")
@Type(type="XXX.XXX.EnumIntValPersistType",
parameters = {
@Parameter(name="enumName",value="XXX.XXX.FlowStatus")
})
public FlowStatus getStatus() {
return status;
}
public void setStatus(FlowStatus status) {
this.status = status;
}
}
1.4转换类
public class EnumIntValPersistType implements ParameterizedType,Serializable {
private Class<Enum<?>> enumName = null;
private Method mehodOfGetPersistVal = null;
private Method methodOfGetEnumVal = null;
@Override
public void setParameterValues(Properties pty) {
if(pty != null) {
try {
enumName = (Class<Enum<?>>) Class.forName(pty.getProperty("enumName ").toString());
enumObj = enumName .getEnumConstants()[0];
this.mehodOfGetPersistVal = enumName .getMethod("getPersistVal");
this.methodOfGetEnumVal = enumClz.getMethod("getEnumVal", new Class[]{Integer.class});
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}