日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:256日期: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策略則像兔子一樣快速繁殖。然而,你所經??吹降牧晳T用法并不是最好的做法。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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久人人97超碰国产公开结果| 国产日韩一区二区三区在线 | 亚洲美女久久精品| 麻豆精品在线视频| 国产在线一区不卡| av资源中文在线天堂| 福利一区二区三区视频在线观看| 四虎成人av| 精品成人免费一区二区在线播放| 色老板在线视频一区二区| 日韩久久一区二区三区| 999精品一区| 亚洲一区二区网站| 中文不卡在线| 欧美三区不卡| 国产精品多人| 国产66精品| 激情久久五月| 亚洲欧洲日韩| 国产极品久久久久久久久波多结野 | 99国产精品一区二区| 久久蜜桃av| 日韩影院精彩在线| 日韩高清在线一区| 精品三级在线| 美女网站一区| 国产精品毛片在线| 日韩欧美中文字幕一区二区三区 | 婷婷国产精品| 丝袜美腿高跟呻吟高潮一区| 日本在线观看不卡视频| 国产精品magnet| 日韩电影二区| 亚洲一区二区三区四区五区午夜| 日本强好片久久久久久aaa| 麻豆精品在线| 久久理论电影| 日本成人在线一区| 青青青免费在线视频| 在线一区视频| 国产精品99久久免费| 久久精品国产大片免费观看| 中文字幕视频精品一区二区三区 | 精品视频一二| 黄色亚洲大片免费在线观看| 久久国产婷婷国产香蕉| 桃色一区二区| 日韩欧美中文字幕电影| 极品av在线| 久久亚洲一区| 国产在线视频欧美一区| 一区福利视频| 久久精品国产99国产精品| 国产99精品| 欧美精品三级在线| 国产一区日韩一区| 国产精品亚洲综合久久| 九色精品91| 国产精品亚洲二区| 一本一道久久a久久精品蜜桃| 国产精品美女久久久久久不卡| 久久精品国产亚洲夜色av网站| 国产欧美日韩影院| 国产亚洲午夜| 日韩在线观看| 日韩精品免费一区二区夜夜嗨 | 日韩精品中文字幕一区二区| 日本不良网站在线观看| 日本精品久久| 婷婷成人基地| 精品三级在线| 欧美一级一区| 日韩视频二区| 国产精品久久观看| 欧美亚洲二区| 中文不卡在线| 一区三区视频| 欧美国产美女| 国产美女撒尿一区二区| 九一国产精品| 国产色播av在线| 久久精品99国产精品| 中文精品在线| 欧美手机在线| 亚洲va中文在线播放免费| 麻豆国产精品| 久久国内精品自在自线400部| 日韩影院精彩在线| 91久久久精品国产| 久久男女视频| 在线看片福利| 久久中文字幕一区二区三区| 丝袜国产日韩另类美女| 日本精品影院| 欧美韩日一区| 久久中文字幕一区二区三区| 欧美日韩午夜| 日韩av一区二区三区| 一区二区国产在线| 久久不射网站| 99在线|亚洲一区二区| 亚洲二区精品| 色婷婷狠狠五月综合天色拍| 麻豆视频在线看| av日韩中文| 国产精品久久久久蜜臀| 久久精品资源| 国产精品一区亚洲| 国产日产精品_国产精品毛片| 亚洲精品日本| 亚洲资源在线| 中文字幕一区日韩精品| 蜜桃视频一区二区三区| 亚洲中字黄色| 99综合视频| 99日韩精品| 日本 国产 欧美色综合| 西西人体一区二区| 日韩中文字幕91| 综合亚洲自拍| 日韩欧美激情电影| 青草国产精品| 91欧美极品| 欧美日韩在线精品一区二区三区激情综合| 亚洲精品在线a| 日韩国产精品久久久久久亚洲| 日韩一区二区三区精品视频第3页| 亚洲精品系列| 国产日韩三级| 久久伊人久久| 国产成人精品一区二区三区免费 | 免费亚洲一区| 成人在线丰满少妇av| 97欧美在线视频| 青青青免费在线视频| 亚洲va中文在线播放免费| 久久精品99久久无色码中文字幕| 亚洲二区精品| 人人精品人人爱| 国产欧美二区| 综合日韩av| 免费国产自久久久久三四区久久| 黄色日韩在线| 日韩va亚洲va欧美va久久| 国产精品九九| 久久久噜噜噜| 亚洲视频电影在线| 国产精品一线天粉嫩av| 日本久久精品| 成人久久久久| 久久午夜精品| 国产欧美综合一区二区三区| 卡一卡二国产精品| 另类中文字幕国产精品| 日韩在线卡一卡二| 国产经典一区| 99成人在线视频| 亚洲专区视频| 精品中国亚洲| 午夜av一区| 日韩av在线播放中文字幕| 国产精品精品| 丝袜国产日韩另类美女| 国产精品毛片aⅴ一区二区三区| 里番精品3d一二三区| 久久久久蜜桃| 日本亚洲最大的色成网站www| 精品视频一区二区三区四区五区| 亚洲一级高清| 国产人成精品一区二区三| 久久精品一区二区不卡| 涩涩涩久久久成人精品| 成午夜精品一区二区三区软件| 亚洲黄色在线| 国产精品chinese| 狠狠爱成人网| 免费在线欧美黄色| 婷婷成人在线| 欧美在线首页| 日韩免费一区| 国产一区二区高清| 久久99影视| 国产亚洲福利| 国产成人免费| 亚洲精品人人| 色婷婷狠狠五月综合天色拍| 日韩亚洲精品在线观看| 九九色在线视频| 日韩精品国产欧美| 久久夜夜操妹子| 欧美亚洲网站| 欧美网站在线| 国产中文字幕一区二区三区| 日韩中文字幕1| 麻豆视频在线看| 日韩一区二区三区四区五区 | 欧美三区四区| 欧美日韩99| 石原莉奈一区二区三区在线观看| 福利一区视频|