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

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

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

    風人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
    數據加載中……

    SpringSide中使用的JDK5.0特性

    SpringSide中使用的JDK5.0特性

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

    1.AutoBoxing 與 For Each 循環

    ??? 本來int的非Object性就很無聊,在JDK5.0終于提供了autoboxing功能。這個語法簡化糖,被用在了每一個地方。

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

    2. 泛型

    ??? 泛型大量用于SpringSide Core中的基類,使子類更簡潔,基類更強大。當然,基類是難讀了,所以才需要社區花上這么長的時間來把<T>看到順眼。

    ??? 泛型使用的有兩個定式:

    2.1 避免強制類型轉換

    ???如果函數輸入參數里含Class類型,而返回值又是該Class的實體,應該將該函數設為泛型函數。最典型的例子是HibernateGenericDao的get() 函數

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

    ? 其中眼花繚亂的第一個<T>聲明這是一個泛型函數,第2個T聲明返回值為T,第三個Class<T>代表 T.class。基類寫的辛苦,但子類用得爽快?

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

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

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

    BookManager extends HibernateEntityDao<Book>

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

    ??? 一舉兩得地既避免了強制類型轉換,又聲明了T.class 供框架使用,無須再在Manager的構造函數或getEntityClass()函數定義entityClass,。

    ??? 反射的API 詳見GenricsUtils ,精簡的對上面BookManager的定義反射代碼如下:

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

    ???泛型反射的關鍵是獲取ParameterizedType,再調用它的getActualTypeArguments()方法獲得實際綁定的類型。但注意public class BookManager<Book>是不能被反射的,因為擦拭法的緣故。只有在Superclass 或者成員變量(Field.getGenericType())等有函數返回ParameterizedType的時候才能成功反射,,

    比如?

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

    ?2.3 其他應用

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

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

    3.Annotation

    ???? Annotation 大幅提升了Java的編程模式,SpringSide 目前運用的Annotation 有以下三個地方,幸運的是前兩者同時也提供JDK1.4的JAVADoc式配置,只是麻煩一點點而已

    ???? 3.1. Hibernate Annotation

    ???????? 使用Hibernate Annotation 代替hbm文件,因為annotation高度的默認性,典型的POJO基本上不需要定義什么,代碼的簡約性和可管理性大幅提高,直追ROR。

    ???????? 另外,經過測試,annotation 完全能勝任一些比較復雜的Mapping定義,如Product-Book的父子繼承關系,Order-OrderItem-Product的經典三角關系。

    ???? 2. XFire JSR181 Annotation

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

    ???? 3.?聲明Entity類型的Annotation

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

    4. 三種內置Annotation

    JDK5.0 有SuppressWarnings,Deprecated和Override 三種內置的annotation:

    ? @Override

    ?? 此標簽一方面提醒用戶這是個重載函數,另一方面保證了父類函數的參數或者名字改變時,子類如果沒有跟著變化,就會編譯不過。

    ?? 雖然有點占地方,但用處的確很大,不會哪天子類被人賣了都不知道。

    ? 所以我設置了讓IDEA6檢查所有重載函數必須加上@Override標識。

    ? @SuppressWarnings("unchecked")

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

    ??? 因為有些非JDK5.0的開源庫如hibernate, 函數返回的一定是List,而不會是List<User>,這時候IDE就會爆出很多warning。用SuppressWarning("unchecked")可以讓IDE安靜一些。

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

    ? @Deprecated

    ?? 此標簽以前寫在JavaDoc里,現在提到annotation,注釋已廢棄的函數。用戶使用該函數的話,編譯時會得到"你用了廢棄"的提示。

    5.可變參數

    用于HibernateGenericDao中,簡化函數接口。

    比如 一個public List find(String hql, Object... values),就支持了如下四種調用,避免了以前的煞費苦心的定義多種接口,然后把參數轉成統一模式的大量重復定義。

    dao.find(hql);
    dao.find(hql,arg0);
    dao.find(hql,arg0,arg1);
    dao.find(hql,new Object[arg0,arg1])
    

    posted on 2006-12-16 15:28 風人園 閱讀(360) 評論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 久久精品国产亚洲麻豆| 毛片基地免费观看| 国产亚洲美女精品久久久2020| 亚洲色丰满少妇高潮18p| 一个人免费观看www视频在线| 久久精品国产亚洲AV嫖农村妇女 | 国产成人综合亚洲绿色| 国产男女猛烈无遮挡免费网站| 亚洲jizzjizz少妇| 又粗又大又硬又爽的免费视频| 羞羞视频在线免费观看| 亚洲国产精品日韩| 国产精品无码永久免费888| 亚洲无人区一区二区三区| 久草免费手机视频| 亚洲成a人片在线观看中文app| 99久久99这里只有免费费精品| 亚洲va乱码一区二区三区| 免费看AV毛片一区二区三区| 粉色视频成年免费人15次| 中文字幕专区在线亚洲| 欧洲人成在线免费| 亚洲Av无码一区二区二三区| 国产免费直播在线观看视频| 黄色视屏在线免费播放| 亚洲国色天香视频| 亚洲第一区在线观看| 毛片免费在线观看| 亚洲成_人网站图片| 免费jjzz在在线播放国产| 免费无码又爽又刺激网站直播 | 色偷偷亚洲女人天堂观看欧| 日本成人免费在线| 久久青青草原国产精品免费| 亚洲国产精品综合福利专区| 国产免费午夜a无码v视频| 免费观看成人久久网免费观看| 亚洲首页国产精品丝袜| 久久久久久A亚洲欧洲AV冫| 四虎在线最新永久免费| 男人j进女人p免费视频|