• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····
              Java 5的泛型語法已經有太多書講了,這里不再打字貼書。GP一定有用,不然Java和C#不會約好了似的同時開始支持GP。但大家也清楚,GP和Ruby式的 動態OO語言屬于不同的意識形態,如果是一人一票,我想大部分的平民程序員更熱衷動態OO語言的平白自然。但如果不準備跳槽到支持JSR223的動態語 言,那還是看看GP吧。

               胡亂總結泛型的四點作用:
               第一是泛化,可以拿個T代表任意類型。 但GP是被C++嚴苛的靜態性逼出來的,落到Java、C#這樣的花語平原里----所有對象除幾個原始類型外都派生于Object,再加上Java的反射功能,Java的Collection庫沒有范型一樣過得好好的。

               第二是泛型 + 反射,原本因為Java的泛型拿不到T.class而覺得泛型沒用,最近才剛剛學到通過反射的API來獲取T的Class,后述。

               第三是收斂,就是增加了類型安全,減少了強制類型轉換的代碼。這點倒是Java Collection歷來的弱項。

               第四是可以在編譯期搞很多東西,比如MetaProgramming。但除非能完全封閉于框架內部,框架的使用者和擴展者都不用學習這些東西的用法,否則 那就是自絕于人民的票房毒藥。C++的MetaProgramming好厲害吧,但對比一下Python拿Meta Programming生造一個Class出來的簡便語法,就明白什么才是真正的叫好又叫座。

               所以,作為一個架構設計師,應該使用上述的第2,3項用法,在框架類里配合使用反射和泛型,使得框架的能力更強; 同時采用收斂特性,本著對人民負責的精神,用泛型使框架更加類型安全,更少強制類型轉換。
               
               擦拭法避免了Java的流血分裂 :
                大家經常罵Java GP的擦拭法實現,但我覺得多虧于它的中庸特性---如果你用就是范型,不用就是普通Object,避免了Java陣營又要經歷一場to be or not to be的分裂。 
                最大的例子莫過Java 5的Collection 框架, 比如有些同學堅持認為自己不會白癡到類型出錯,而且難以忍受每個定義的地方都要帶一個泛型定義List〈Book〉,不用強制類型轉換所省下的代碼還不夠N處定義花的(對了,java里面還沒有tyepdef.....),因此對范型十分不感冒,這時就要齊齊感謝這個搽拭法讓你依然可以對一個泛型框架保持非泛型的用法了...

               通過反射獲得 T.class:
               
                不知為何書上不怎么講這個,是差沙告訴我才知道的,最經典的應用見Hibernate wiki的Generic Data Access Objects, 代碼如下: 
            abstract public class BaseHibernateEntityDao<T> extends HibernateDaoSupport {
             
            private Class<T> entityClass;
             
            public BaseHibernateEntityDao() {
                    entityClass 
            =(Class<T>) ((ParameterizedType) getClass()
                                            .getGenericSuperclass()).getActualTypeArguments()[0];
                }
             
            public T get(Serializable id) {
                    T o 
            = (T) getHibernateTemplate().get(entityClass, id);
            }
            }

              精華就是這句了:
            Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

              泛型之后,所有BaseHibernateEntityDao的子類只要定義了泛型,就無需再重載getEnttityClass(),get()函數和find()函數,銷益挺明顯的,所以SpringSide的Dao基類毫不猶豫就泛型了。

              不過擦拭法的大棒仍在,所以子類的泛型語法可不能亂寫,最正確的用法只有:
                public class BookDao extends BaseHibernateEntityDao<Book>

            轉自:
            http://www.blogjava.net/calvin/archive/2009/12/10/43830.html
            posted on 2012-04-14 21:47 小果子 閱讀(541) 評論(0)  編輯 收藏 引用 所屬分類: Android & Ios
            久久精品成人免费网站| 色婷婷综合久久久久中文一区二区| 久久99中文字幕久久| 91久久成人免费| 久久久久国产精品嫩草影院| 精品无码久久久久久午夜| 99久久精品免费看国产一区二区三区| 狠狠人妻久久久久久综合蜜桃| 久久婷婷五月综合97色直播| 久久精品中文字幕久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 日产精品久久久久久久| 久久国产成人午夜aⅴ影院| 国产成人无码精品久久久性色| 国产精品久久久久影院嫩草| 2020久久精品亚洲热综合一本| 99久久精品免费看国产| 人人狠狠综合久久88成人| 亚洲а∨天堂久久精品9966| 欧美亚洲国产精品久久蜜芽| 久久免费的精品国产V∧| 深夜久久AAAAA级毛片免费看| 亚洲午夜久久久精品影院| 国产亚洲精品自在久久| 亚洲中文字幕无码久久2020| 久久精品国产欧美日韩99热| 精品久久久久中文字幕一区| 99久久99这里只有免费的精品| 亚洲狠狠婷婷综合久久久久| 久久丫忘忧草产品| 免费无码国产欧美久久18| 亚洲国产精品无码久久九九| 看全色黄大色大片免费久久久| 国产精品无码久久久久| 精品久久久久久国产牛牛app| 精品国产乱码久久久久久浪潮| 88久久精品无码一区二区毛片 | 伊人丁香狠狠色综合久久| jizzjizz国产精品久久| 国产成人99久久亚洲综合精品| 99久久伊人精品综合观看|