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

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

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

    空間站

    北極心空

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    SpringSide中使用的JDK5.0特性

          隨著光陰推移,Annotation 慢慢在開(kāi)源框架中推廣,泛型漸漸被程序員們用熟,加上AutoBoxing的小糖,SpringSide終于離不開(kāi)JDK5.0。

    1.AutoBoxing 與 For Each 循環(huán)

        本來(lái)int的非Object性就很無(wú)聊,在JDK5.0終于提供了autoboxing功能。這個(gè)語(yǔ)法簡(jiǎn)化糖,被用在了每一個(gè)地方。

        for each 循環(huán)也改善了原本總要愣一下的collection遍歷。不過(guò)對(duì)于非JDK基本類型,collection必須用泛型聲明,如List<Book>。

    2. 泛型

        泛型大量用于SpringSide Core中的基類,使子類更簡(jiǎn)潔,基類更強(qiáng)大。當(dāng)然,基類是難讀了,所以才需要社區(qū)花上這么長(zhǎng)的時(shí)間來(lái)把<T>看到順眼。

        泛型使用的有兩個(gè)定式:

    2.1 避免強(qiáng)制類型轉(zhuǎn)換

       如果函數(shù)輸入?yún)?shù)里含Class類型,而返回值又是該Class的實(shí)體,應(yīng)該將該函數(shù)設(shè)為泛型函數(shù)。最典型的例子是HibernateGenericDao的get() 函數(shù)

    public <T> T get(Class<T> entityClass, Serializable id) {
    return (T) getHibernateTemplate().get(entityClass, id);
    }

      其中眼花繚亂的第一個(gè)<T>聲明這是一個(gè)泛型函數(shù),第2個(gè)T聲明返回值為T(mén),第三個(gè)Class<T>代表 T.class。基類寫(xiě)的辛苦,但子類用得爽快 

       Book book = (Book)manager.get(Book.class,1) 簡(jiǎn)化成了 Book book = manager.get(Book.class,1);

    2. 2 泛型配合反射API從T獲得 T.class。

       最典型的例子HibernateEntityDao,子類只需以下定義,即獲得要管理的Entity的Class。

    BookManager extends HibernateEntityDao<Book>

        此時(shí)子類只要聲明一次T,上面的Book book = (Book)manager(Book.class,1) 就能簡(jiǎn)化成Book book = manager.get(1);

        一舉兩得地既避免了強(qiáng)制類型轉(zhuǎn)換,又聲明了T.class 供框架使用,無(wú)須再在Manager的構(gòu)造函數(shù)或getEntityClass()函數(shù)定義entityClass,。

        反射的API 詳見(jiàn)GenricsUtils ,精簡(jiǎn)的對(duì)上面BookManager的定義反射代碼如下:

    Type genType = clazz.getGenericSuperclass();
    Type [] params = ((ParameterizedType) genType).getActualTypeArguments();
    return (Class) params[0];

       泛型反射的關(guān)鍵是獲取ParameterizedType,再調(diào)用它的getActualTypeArguments()方法獲得實(shí)際綁定的類型。但注意public class BookManager<Book>是不能被反射的,因?yàn)椴潦梅ǖ木壒省V挥性赟uperclass 或者成員變量(Field.getGenericType())等有函數(shù)返回ParameterizedType的時(shí)候才能成功反射,,

    比如 

    public class BookManager extends Manager<Book>{} public class BookAction {    private BookManager<Book> manager;}

     2.3 其他應(yīng)用

       1. 在XFire中,List getBooksByCategory()函數(shù)返回的結(jié)果,需要用aegis.xml 文件聲明List中的元素為Book.

       而如果定義函數(shù)為 List<Book> getBooksByCategory(),就不再需要聲明,省掉XMl配置文件。

    3.Annotation

         Annotation 大幅提升了Java的編程模式,SpringSide 目前運(yùn)用的Annotation 有以下三個(gè)地方,幸運(yùn)的是前兩者同時(shí)也提供JDK1.4的JAVADoc式配置,只是麻煩一點(diǎn)點(diǎn)而已

         3.1. Hibernate Annotation

             使用Hibernate Annotation 代替hbm文件,因?yàn)閍nnotation高度的默認(rèn)性,典型的POJO基本上不需要定義什么,代碼的簡(jiǎn)約性和可管理性大幅提高,直追ROR。

             另外,經(jīng)過(guò)測(cè)試,annotation 完全能勝任一些比較復(fù)雜的Mapping定義,如Product-Book的父子繼承關(guān)系,Order-OrderItem-Product的經(jīng)典三角關(guān)系。

         2. XFire JSR181 Annotation

             JSR181聲明的Web Service,比原本用xml定義的模式節(jié)約了XML文件和配置代碼的數(shù)量。

         3. 聲明Entity類型的Annotation

             使用Annotation 聲明Entity的類型,比如Udeletable,Auditable 等,比用接口聲明的方式有更少的侵入性,詳見(jiàn) 侵入,非侵入?Interface vs Annotation

    4. 三種內(nèi)置Annotation

    JDK5.0 有SuppressWarnings,Deprecated和Override 三種內(nèi)置的annotation:

      @Override

       此標(biāo)簽一方面提醒用戶這是個(gè)重載函數(shù),另一方面保證了父類函數(shù)的參數(shù)或者名字改變時(shí),子類如果沒(méi)有跟著變化,就會(huì)編譯不過(guò)。

       雖然有點(diǎn)占地方,但用處的確很大,不會(huì)哪天子類被人賣(mài)了都不知道。

      所以我設(shè)置了讓IDEA6檢查所有重載函數(shù)必須加上@Override標(biāo)識(shí)。

      @SuppressWarnings("unchecked")

        此標(biāo)簽可以讓編譯器忽略某種warning信息,比如減少JDK5.0的集合操作引入范型后無(wú)處不在的warning。

        因?yàn)橛行┓荍DK5.0的開(kāi)源庫(kù)如hibernate, 函數(shù)返回的一定是List,而不會(huì)是List<User>,這時(shí)候IDE就會(huì)爆出很多warning。用SuppressWarning("unchecked")可以讓IDE安靜一些。

        其他常用warning還包括 @SuppressWarnings("unused") 和 SuppressWarnings("serial")

      @Deprecated

       此標(biāo)簽以前寫(xiě)在JavaDoc里,現(xiàn)在提到annotation,注釋已廢棄的函數(shù)。用戶使用該函數(shù)的話,編譯時(shí)會(huì)得到"你用了廢棄"的提示。

    5.可變參數(shù)

    用于HibernateGenericDao中,簡(jiǎn)化函數(shù)接口。

    比如 一個(gè)public List find(String hql, Object... values),就支持了如下四種調(diào)用,避免了以前的煞費(fèi)苦心的定義多種接口,然后把參數(shù)轉(zhuǎn)成統(tǒng)一模式的大量重復(fù)定義。

    dao.find(hql);
    dao.find(hql,arg0);
    dao.find(hql,arg0,arg1);
    dao.find(hql,new Object[arg0,arg1])
    
    posted on 2007-08-03 17:47 蘆葦 閱讀(453) 評(píng)論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 美女被爆羞羞网站免费| 国产亚洲福利一区二区免费看| 野花高清在线观看免费3中文| 亚洲一区精彩视频| 亚洲欧洲中文日韩久久AV乱码| 亚洲剧情在线观看| 57pao一国产成视频永久免费| 亚洲AV无码第一区二区三区| a级黄色毛片免费播放视频| 亚洲精品国产专区91在线| 日韩一区二区在线免费观看| 在线免费观看h片| 亚洲JLZZJLZZ少妇| 亚洲AV无码久久| 国产精品成人免费综合| 最好看的中文字幕2019免费| 亚洲成av人片在线看片| 亚洲无码日韩精品第一页| 在线视频观看免费视频18| 中文毛片无遮挡高清免费| 亚洲午夜无码久久| 免费日本黄色网址| 999国内精品永久免费观看| 一个人免费播放在线视频看片| 精品亚洲AV无码一区二区三区 | 亚洲а∨精品天堂在线| 久久亚洲高清观看| 免费国产成人高清在线观看麻豆| 在线观看免费中文视频| 久久久久免费视频| 中文字幕亚洲精品资源网| 亚洲无码视频在线| 四虎影在线永久免费四虎地址8848aa| 亚洲国产精品免费在线观看| 亚洲欧洲无卡二区视頻| 亚洲熟妇少妇任你躁在线观看无码 | 亚洲熟妇自偷自拍另欧美| 亚洲精品午夜视频| 亚洲电影一区二区三区| 最新中文字幕电影免费观看| 亚洲免费精彩视频在线观看|