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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲码国产精品高潮在线| 亚洲a级片在线观看| 久久久久亚洲AV成人无码网站| 亚洲国产女人aaa毛片在线| 亚洲中文精品久久久久久不卡| 国产99视频精品免费视频76| 18禁网站免费无遮挡无码中文| 亚洲国产综合人成综合网站| 亚洲中文久久精品无码1| 91网站免费观看| 亚洲日本成本人观看| 99久热只有精品视频免费观看17| heyzo亚洲精品日韩| 久久精品国产亚洲av麻豆图片| 久久www免费人成看片| 亚洲中文久久精品无码| 色九月亚洲综合网| 美女视频黄的全免费视频| 亚洲日韩中文无码久久| 久久免费精品视频| 精品国产香蕉伊思人在线在线亚洲一区二区 | 亚洲av无码一区二区三区天堂| 95老司机免费福利| 日本亚洲欧洲免费天堂午夜看片女人员| 国产亚洲精品AAAA片APP| 亚洲精品国产精品乱码不卡| 免费在线黄色电影| 伊人久久精品亚洲午夜| 99久久久国产精品免费牛牛| 亚洲男人的天堂久久精品| 99在线精品免费视频九九视| 亚洲AV永久无码精品网站在线观看| 亚洲第一区精品观看| 色屁屁在线观看视频免费| 精品国产免费观看| 亚洲av无码一区二区三区在线播放| 国产成人毛片亚洲精品| 中文字幕成人免费高清在线| 国产性爱在线观看亚洲黄色一级片| 999任你躁在线精品免费不卡| 亚洲JLZZJLZZ少妇|