在实际的开发实践中使用enum类型的地方还是比较的多的比如逻辑的“是”、“非”或者叫0、1;对于这样的情形,我们实在没有必要为它们创建一个数据字典(这里是指创建一个数据库表)现在一般使用枚举类型来处理这种情形。如果果真选择了枚举类型,那就难免的要在String类型(或者Integer,...)和枚举类型之间的转化,至少在我使用的struts1.x的情形下Form还不能很智能的根据一个字符串来理智的转化为我需要的enum类型,这就需要自己处理一些根据字符串的值来得到相应的枚举类型,或者把某个枚举类型的值转化为字符串的形式,这种情形下使用“富”枚举类型个人认为是个不错的选择,以(0,1)为例子实现如下:
1、“贫”枚举类型:
/*
* Created on 2007-07-07
*/
package com.snow.enums;
/**
* @author anweixiao
*/
public enum LogicType {
YES,
NO;
@Override
public String toString(){
switch(this){
case YES:
return "0";
case NO:
return "1";
}
return super.toString();
}
}
在这种情况下,如果需要不同类型之间的相对转化的话,就需要特别的处理为:
1.1、枚举类型转化为字符串:
public void transFromLogicType(UseLogicTypeData data){
LogicType type = data.getType();
if(type==null)
this.typeStr = null;
else
this.typeStr = String.valueOf(type.ordinal());
}
1.2、字符串转化为枚举类型(我尤其不喜欢这种转化):
public void transToLogicType(UseLogicTypeData data){
for(LogicType t:LogicType.values()){
if(t.equals(getTypeStr())){
data.setType(t);
break;
}
}
}
2、“富”枚举类型的实现
/*
* Created on 2007-07-07
*/
package com.snow.enums;
/**
* @author anweixiao
*/
public enum LogicType {
YES,
NO;
@Override
public String toString(){
switch(this){
case YES:
return "0";
case NO:
return "1";
}
return super.toString();
}
public static LogicType getLogicTypeByI(Integer ordi){
if(ordi==null)return null;
if((ordi<0)||(ordi>LogicTypeCache.cache.length))
return null;
else
return LogicTypeCache.cache[ordi];
}
public static String getLogicTypeStr(LogicType type){
if(type==null)
return null;
else
return String.valueOf(type.ordinal());
}
private static class LogicTypeCache{
private LogicTypeCache(){}
static LogicType[] cache= LogicType.values();
}
}
经过这样的处理在相互转化的时候可以处理为:
2.1、枚举类型转化为字符串:
public void transToLogicType2(UseLogicTypeData data){
String str = getTypeStr();
Integer i = (str==null?null:new Integer(str));
data.setType(LogicType.getLogicTypeByI(i));
}
2.2、字符串转化为枚举类型:
public void transFromLogicType2(UseLogicTypeData data){
this.typeStr = LogicType.getLogicTypeStr(data.getType());
}
通过这种“富”枚举类型可以简化不同类型之间转化的代码重复的可能性,同时也使用了cache来消除转化时逐个匹配选值的问题。如果这种方式不能很好的解决这类问题,还请不吝赐教