<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1161) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久久久亚洲av无码蜜芽| 亚洲中文字幕久久久一区| 一区二区三区精品高清视频免费在线播放 | 国产AV无码专区亚洲Av| 三级黄色免费观看| 亚洲AV美女一区二区三区| 日本在线看片免费人成视频1000| 久久精品国产亚洲AV无码偷窥| 96免费精品视频在线观看| 亚洲国产成人精品无码一区二区 | 成人黄页网站免费观看大全| 亚洲欧美日韩中文高清www777| 在线免费一区二区| 免费人妻精品一区二区三区| 综合亚洲伊人午夜网| 无码午夜成人1000部免费视频| 亚洲成av人片在线看片| 精品国产免费一区二区| 国产亚洲Av综合人人澡精品| 色噜噜AV亚洲色一区二区| 久久国产乱子伦精品免费不卡| 亚洲成人黄色网址| 日韩视频免费在线| 中文字幕在线成人免费看| 亚洲黄色网站视频| 免费看的一级毛片| 一级做a爱过程免费视频高清| 亚洲AV无码成人精品区蜜桃| 男女做羞羞的事视频免费观看无遮挡| 亚洲精品天堂成人片AV在线播放 | 亚洲精品人成无码中文毛片| 国产精品免费高清在线观看| 亚洲国产成人资源在线软件| 免费国产综合视频在线看| 精品国产免费一区二区三区香蕉 | 在线亚洲高清揄拍自拍一品区| 亚洲成?Ⅴ人在线观看无码| 91福利视频免费| 日韩在线视频线视频免费网站| 91亚洲导航深夜福利| 国产无遮挡裸体免费视频|