如何构造一个“富”枚举类型

    在实际的开发实践中使用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来消除转化时逐个匹配选值的问题。如果这种方式不能很好的解决这类问题,还请不吝赐教

你可能感兴趣的:(cache)