PC的blog

Finding... Thinking... Solving...

BlogJava 首页 新随笔 联系 聚合 管理
  9 Posts :: 0 Stories :: 54 Comments :: 0 Trackbacks
在上一篇博客里,我编写了一个UserType,实现了持久化自定义的enum类,其实那个例子中存在两个缺点。这两个缺点是关于如何正确使用enum以及generic的,她们已经和hibernate userType无关了,因此另起一个主题讨论。

在上一篇博客中,我的enum是这么写的:

public enum Status implements DescriptionID {

    ACTIVATED(
5"This object is activated"),  
    DEACTIVATED(
9"This object is deactivated");

    
private Integer id;
    
private String description;
    
private static List<Status> list;

    
static {
        list 
= new ArrayList<Status>(2);
        list.add(ACTIVATED);
        list.add(DEACTIVATED);
    }

    
private Status(int statusNr, String description) {
        
this.id = statusNr;
        
this.description = description;
    }

    
public String getDescription() {

        
return this.description;
    }

    
public Integer getId() {
        
return id;
    }

    
public static List<Status> getAll() {
        
return list;
    }

    
public static Status findById(Integer id) {
        
for (Status status : getAll()) {
            
if (id == status.getId()) {
                
return status;
            }
        }
        
return null;
    }

}

其中两个static方法是为了方便使用。

缺点一:

         所有的enum实例必须手动纳入list集合中。

解决方法:
 
        解决方法非常简单,是用Class类提供的方法getEnumConstants(), 代码如下:

    public static List<Status> getAll() {
        
return Arrays.asList(Status.class.getEnumConstants());
    }

我个人比较讨厌数组,因此这里特意将数组转换成List。如果你们不介意使用数组的话,getAll()方法完全可以省略。

缺点二:

           findById(Integer id) 方法名并不贴切,叫getEnumById(Integer id)会更好些。另外一模一样的方法必须在每一个enum类中重复编写,如果某个地方需要改动,那就需要改动所有相关的enum类,这是一个很明显的bad smell。

解决方法:

        编写一个util类,将逻辑转移到util类中,getEnumById(Integer id)方法调用util类中的相关方法,代码如下:

    public static Status getEnumById(Integer id) {
        
return EnumUtils.getEnum(Status.class, id);
    }

public class EnumUtils {

    
public static <extends DescriptionID> I getEnum(Class<I> type, int id) {
        I[] types 
= type.getEnumConstants();
        
for (I t : types) {
            
if (t.getId() == id)
                
return t;
        }
        return null;

    }
}

这里getEnum(Class<I> type, int id)方法利用Java 5的新特性generic,利用给定的Class和enum id,返回对应的enum实例。这样处理好处很明显,获取enum实例的逻辑代码只存在与util类中,日后修改十分方便。

相关内容请参阅我写的《Hibernate 3和Java Persistence API 程序开发从入门到精通》一书。




声明:本文版权归作者所有,如需转载请注明出处。

posted on 2008-03-29 00:58 polygoncell 阅读(1153) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: