国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

一個基于Annotation的持久層框架-去除getter和setter

瀏覽:70日期:2024-07-18 18:30:34
內容: 使用J2SE 5.0的注解來去除getter和setter摘要getter/setter這種習慣用法一直是有問題的,它允許你的類更容易被訪問,卻使這些類失去了可維護性。J2SE 5.0的注解(或者說元數據)提供了另一種可能性。比起用自省尋找get/set方法,你可以用注解“標注類,然后在編譯或者運行時訪問那個注解。這篇文章不僅描述了注解機制,還介紹了一個基于XML的持久化機制的輸出端,這個機制使用注解來標注類和字段。我曾經在JavaWorld對getter/setter這種習慣用法的缺點做了很詳細的討論(請看資源)。這種習慣用法一開始是在JavaBean規范中被介紹的,以作為一種“標注對象屬性的方法,這樣,一個擴展的用戶界面層工具(叫做BeanBox)可以為那個對象創建一系列的屬性列表。你可以像下面那樣提供方法來“標注屬性。String getFoo();void setFoo( String newValue );BeanBox使用Class類中的自省API獲取方法列表,然后使用模式匹配來尋找getter/setter對。根據這些推斷出屬性是否存在,并確定屬性的類型(在這個例子中,有一個String類型的Foo屬性)。你是不會調用這些方法的,它們只會被BeanBox調用。有趣的是,JavaBean規范的作者完全清楚getter/setter標注機制的問題所在(主要缺點已經在以前的文章中討論過了,getter/setter方法暴露了過多的對象實現信息,所以底層類很難維護)。因此,設計者提供了大量的面向對象解決方法,比如BeanInfo和Customizer接口。用戶實現了這些接口以后,就可以在沒有setter/getter的條件下建立圖形用戶界面。不幸的是,這些過度復雜的面向對象方法在規范里很少提到。Getter/setter方法是簡單的,可是如果你不能理解面向對象關系的維護問題,getter/setter方法好象是很合理的。因此,BeanInfo/Customizer方法就沒落了,而getter/setter策略則像兔子一樣快速繁殖。然而,你所經常看到的習慣用法并不是最好的做法。JavaBean剛被提出時,許多人(包括我自己)贊成在Java中使用新的關鍵字來消除getter和setter。利用新引入的關鍵字的能力,我在早些時候像下面那樣描述Foo屬性:private @property String foo;因為foo是私有的,所以用新的關鍵字把它暴露給BeanBox并沒有違反封裝的原則??墒沁@時,引入新關鍵字有些離經叛道,盡管這個關鍵字不可能跟已經存在的標識符混淆,畢竟它們包含一個非法字符@。當J2SE 5.0出現時,Sun已經領會到了它的微妙,并且對語言的主要語法做了一點調整?,F在,你可以引入一個新的關鍵字(叫做注解)來表明一個屬性會在編譯時或者運行時被檢查。你可以引入你選擇的任何關鍵字。只需要做到這點,注解(關鍵字)必須有一個前導@符號,并且你必須像使用形容詞一樣使用注解(注解可以放在任何你可以聲明static,final,或者public的地方)。最后,你可以拋開getter和setter了,一種更干凈的語法能夠做到相同的事情。Java內置了兩個很棒的關于注解的例子。想想這樣一種情況,你的類繼承自AWT/Swing的Adapter,可是卻不小心拼錯了基類方法的名字。你認為你覆寫了基類的方法,實際上卻沒有。這種意料之外的繼承是非常難以發現,但是如下的代碼中的錯誤卻很容易被編譯器檢測出來。public class myListener implements MouseListener{ @Overrides void MousePressed(MouseEvent e) { System.out.println('Mouse button clicked!'); }}編譯器在這里會抱怨,因為基類的方法叫做mousePressed()(m是小寫的),而不是MousePressed(),就像類定義的那樣。另外,程序里的注解@Deprecated在語法上也比Javadoc中的要簡潔(因為注釋內容不會影響類的兼容性)。有兩種途徑可以處理注解。首先,Class類的自省API可以獲取關聯到類的注解,以及關聯到類的字段和方法的注解。BeanBox可以使用這種機制來尋找被標注的屬性,并建立起屬性列表。如果你沒有自己的BeanBox,那么還有另一種選擇。JDK提供了apt (Annotation Processing Tool)處理器,它是javac的前端,能夠理解注解,并允許你構建Java源代碼。你需要給apt提供不同的注解處理器插件。在這個例子中,插件會建立一個包裝類,像老式的BeanBox做的那樣,使用getter/setter這種習慣用法來把被注解的屬性暴露給外界。不過,(就算是按Sun的標準)apt的文檔也是非常糟糕的。我會在以后的文章中在介紹如何使用。在這篇文章中,我會展示一個小的持久化框架的“輸出端來告訴你如何使用運行時注解。這個框架并沒有解決全部持久關系問題的打算,但是它很容易的把一個對象的狀態表示為一個XML字符串。你可以用這種原理來取代其他應用中的getter和setter,比如GUI或者幫助系統(通過注解一個類來說明詳細的信息)。版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接作者:Allen Holub ;deafwolf(作者的blog:http://blog.matrix.org.cn/page/deafwolf)原文:http://www.javaworld.com/javaworld/jw-03-2005/jw-0321-toolbox.htmlMatrix:http://www.matrix.org.cn/resource/article/44/44458_annotation+persistence.html關鍵字:annotation;persistence使用XMLExporter類清單1示范了我的持久化框架是如何使用注解的,清單2則展示了相應的輸出。清單1. Test.java:使用XMLExporter 1 package com.holub.persist.test; 2 3 import java.io.*; 4 import java.util.*; 5 import com.holub.persist.*; 6 import com.holub.persist.Exportable; 7 //---------------------------------------------------------------------- 8 @Exportable 9 class Address 10 { private @Persistent String street; 11 private @Persistent String city; 12 private @Persistent String state; 13 private @Persistent('zipcode') int zip; 14 15 public Address( String street, String city, String state, int zip ) 16 { this.street = street; 17 this.city = city; 18 this.state = state; 19 this.zip = zip; 20 } 21 } 22 //---------------------------------------------------------------------- 23 public class Test 24 { 25 @Exportable( name='customer', description='A Customer' ) 26 public static class Customer 27 { 28 @com.holub.persist.Persistent 29 private String name = 'Allen Holub'; 30 31 @Persistent 32 private Address streetAddress = 33 new Address( '1234 MyStreet', 34'Berkeley', 'CA', 99999 ); 35 @Persistent 36 private StringBuffer notes = new StringBuffer( 'Notes go here '); 37 38 private int garbage; // Is not persistant 39 40 @Persistent Collection invoices = new LinkedList(); 41 { invoices.add( new Invoice(0) ); 42 invoices.add( new Invoice(1) ); 43 } 44 } 45 46 @Exportable 47 public static class Invoice 48 { private @Persistent int number; 49 public Invoice( int number ){ this.number = number; } 50 } 51 52 public static void main(String[] args ) throws IOException 53 { Customer x = new Customer(); 54 XmlExporter out = 55 new XmlExporter( 56 new PrintWriter(System.out, true) ); 57 out.flush( x ); 58 } 59 }Listing 2. Test output 1
相關文章:
主站蜘蛛池模板: 国产亚洲精品久久精品6 | 亚洲综合国产精品 | 成人无遮挡毛片免费看 | 婷婷的久久五月综合先锋影音 | 一级黄色录像片 | 日韩三及片 | 亚洲精品综合一二三区在线 | 精品一区二区高清在线观看 | 一级毛片免费在线观看网站 | 日本三级2021最新理论在线观看 | 亚洲成a人片在线观看精品 亚洲成a人片在线观看中 | 国产在线综合一区二区三区 | 日本一极毛片兔费看 | 国产成人精品综合 | 香蕉久久精品国产 | 国产精品欧美激情在线播放 | 毛片大片 | 喷潮白浆直流在线播放 | 亚洲视色| 久久成人国产精品免费 | 在线视频久久 | 中文字幕亚洲精品第一区 | 国产精品国产国产aⅴ | 欧美性色黄大片www 欧美性色黄大片一级毛片视频 | 久久视频精品线视频在线网站 | 国产亚洲欧美久久精品 | 日韩欧美一区二区三区在线观看 | 日本免费一区二区三区视频 | 亚洲一区二区三区不卡在线播放 | 亚洲综合色在线观看 | 久久亚洲国产精品五月天 | 亚洲一区浅井舞香在线播放 | 国产日韩欧美久久久 | 精品区| 在线亚视频 | 国内自拍一区 | 日本久久久久 | 久久一区二区精品 | 京东一热本色道久久爱 | 韩国主播19福利视频在线 | 国产大学生自拍 |