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

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

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

    Vincent

    Vicent's blog
    隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
    數據加載中……

    Java5泛型的用法,T.class的獲取和為擦拭法站臺

    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>

    ?

    posted on 2006-08-24 15:22 Binary 閱讀(303) 評論(0)  編輯  收藏 所屬分類: j2se

    主站蜘蛛池模板: 亚洲一区二区免费视频| 亚洲中文字幕无码爆乳AV| 亚洲av无码成人精品国产| 久久精品国产亚洲av麻豆色欲 | 特黄特色大片免费| 黄色免费在线观看网址| 国产又黄又爽又猛的免费视频播放 | 免费一级特黄特色大片在线 | 五月婷婷亚洲综合| 国产亚洲AV无码AV男人的天堂| 亚洲第一极品精品无码久久| 亚洲午夜在线播放| fc2成年免费共享视频网站| 免费无码一区二区三区| 成人免费视频观看无遮挡| 最新国产AV无码专区亚洲| 伊人免费在线观看高清版| 国国内清清草原免费视频99| 精品国产日韩亚洲一区| 亚洲色大成网站WWW国产| 久久免费精品一区二区| 免费无码又爽又高潮视频| 亚洲电影免费在线观看| 一区二区在线免费视频| 久久不见久久见免费影院 | 亚洲天堂一区二区三区四区| 国产成人无码免费看片软件| 亚洲av日韩av天堂影片精品| 国产精品成人免费福利| 911精品国产亚洲日本美国韩国| 一区二区视频免费观看| 亚洲综合日韩中文字幕v在线 | 国产免费阿v精品视频网址| 亚洲免费视频一区二区三区| 99热亚洲色精品国产88| 日批日出水久久亚洲精品tv| 亚洲视频在线免费观看| 亚洲男人的天堂在线播放| 久草免费福利在线| 亚洲人成无码www久久久| 怡红院亚洲红怡院在线观看|