成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:194日期: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已經領會到了它的微妙,并且對語言的主要語法做了一點調整。現在,你可以引入一個新的關鍵字(叫做注解)來表明一個屬性會在編譯時或者運行時被檢查。你可以引入你選擇的任何關鍵字。只需要做到這點,注解(關鍵字)必須有一個前導@符號,并且你必須像使用形容詞一樣使用注解(注解可以放在任何你可以聲明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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99re这里都是精品| 亚洲老妇xxxxxx| 亚洲激情午夜| 在线观看国产91| 日本一区二区三区在线不卡| 亚洲国产精品久久人人爱| 黑人精品欧美一区二区蜜桃| 欧美日韩国产一区精品一区| 久久久久综合| 国产欧美一区二区精品性| 成人天堂资源www在线| 国产日韩精品视频一区二区三区| 免费亚洲电影| 欧美成人国产一区二区| 自拍偷拍欧美精品| 国产一区啦啦啦在线观看| 亚洲人成毛片在线播放女女| 国产精品久久久久久久久图文区 | 亚洲欧美一级二级三级| 色综合久久久久综合| 中文字幕二三区不卡| 国内一区二区在线| 欧美精三区欧美精三区| 亚洲综合免费观看高清完整版在线 | 黄色亚洲在线| 欧美日韩mp4| 亚洲精品网站在线观看| 在线视频免费在线观看一区二区| 亚洲激情在线激情| 性伦欧美刺激片在线观看| 天天色综合天天| 国模吧视频一区| 日韩一区二区免费高清| 亚洲aⅴ怡春院| 精久久久久久| 艳妇臀荡乳欲伦亚洲一区| 91色乱码一区二区三区| 欧美精品日韩综合在线| 激情欧美一区二区三区在线观看| 欧美乱妇一区二区三区不卡视频| 成人听书哪个软件好| 中文无字幕一区二区三区| 玖玖九九国产精品| 在线亚洲成人| 青青草精品视频| 久久国产一二区| 一区二区三区欧美激情| 色婷婷综合激情| 国产精品1024| 欧美三片在线视频观看| 亚洲午夜一二三区视频| 日本乱码高清不卡字幕| 亚洲综合激情另类小说区| 亚洲一区二区动漫| 亚洲三级理论片| 久久精品女人的天堂av| 国产精品一色哟哟哟| 色婷婷久久久综合中文字幕| 狠狠色狠狠色综合系列| 久久午夜国产精品| 成人app在线| 91精品国产一区二区三区| 久久se这里有精品| 337p日本欧洲亚洲大胆精品| 亚洲三级影院| 美洲天堂一区二卡三卡四卡视频| 久久国产手机看片| 国产一区二区在线免费观看| 2020国产成人综合网| 亚洲精品影院| 中文字幕字幕中文在线中不卡视频| 国产精品乱码一区二区三区| 国产综合一区二区| 中文字幕五月欧美| 亚洲国产日韩在线| 老司机一区二区| 国产婷婷色一区二区三区四区 | 亚洲狼人精品一区二区三区| 天堂资源在线中文精品| 亚洲经典三级| 蜜臀av国产精品久久久久| 精品国产一区二区亚洲人成毛片| 粉嫩av一区二区三区在线播放| 欧美日韩国产精选| 欧美日韩国产高清视频| 青青草精品视频| 中文字幕不卡的av| 欧美色图在线观看| 国产在线视视频有精品| 国产精品久久一卡二卡| 欧美三日本三级三级在线播放| 欧美国产先锋| 亚洲欧美怡红院| 欧美三级日韩在线| 亚洲性感美女99在线| 久久国产精品第一页| 国产精品久久久久久久久久久免费看| 色8久久精品久久久久久蜜| 欧美区亚洲区| 国产最新精品免费| 亚洲韩国精品一区| 精品国产乱码久久久久久1区2区 | 国产精品538一区二区在线| 自拍偷拍亚洲激情| 欧美一区二区三区播放老司机| 亚洲深夜激情| av不卡在线播放| 国产蜜臀97一区二区三区| 日本高清免费不卡视频| 国产精品chinese| 国产精品一二三四五| 亚洲电影视频在线| 国产拍欧美日韩视频二区| 在线观看日产精品| 亚洲欧洲一级| 北条麻妃一区二区三区| 久热成人在线视频| 一区二区三区四区中文字幕| 国产日韩亚洲欧美综合| 欧美一区二区三区播放老司机| 毛片一区二区| 黄色欧美成人| 91亚洲精品乱码久久久久久蜜桃| 精品在线观看免费| 精品少妇一区二区三区在线播放 | 亚洲国产精品99久久久久久久久| 在线综合视频播放| 欧美啪啪一区| 成人午夜在线免费| 久久精品国产99国产| 一区二区三区在线播| 国产女人18水真多18精品一级做| 欧美欧美欧美欧美| 91国模大尺度私拍在线视频| 亚洲深夜影院| 黄色综合网站| 91亚洲国产成人精品一区二三| 国产美女av一区二区三区| 免费成人在线视频观看| 性感美女久久精品| 亚洲一区二区三区视频在线播放| 中日韩免费视频中文字幕| 久久综合一区二区| 欧美一区二区不卡视频| 91国偷自产一区二区开放时间 | 国产精品久久久久影院| 精品国产一区久久| 7777精品伊人久久久大香线蕉完整版| 久久精品中文字幕一区二区三区| 欧美视频一区二区三区| 色狠狠桃花综合| 免费日韩av片| 男女精品网站| 久久www成人_看片免费不卡| 在线观看福利一区| 国产一区二区不卡| 免费人成黄页网站在线一区二区| 亚洲第一久久影院| 亚洲国产美女搞黄色| 亚洲国产日韩在线一区模特| 伊人一区二区三区| 一区二区三区美女| 亚洲综合av网| 亚洲国产va精品久久久不卡综合| 一区av在线播放| 亚洲一区二区美女| 香蕉影视欧美成人| 午夜精品视频一区| 全部av―极品视觉盛宴亚洲| 午夜日韩在线观看| 喷白浆一区二区| 激情文学综合丁香| 国产大陆精品国产| 北条麻妃国产九九精品视频| 色综合天天综合网国产成人综合天| 日韩中文字幕不卡| 日韩一区欧美二区| 奇米影视一区二区三区| 久久99精品一区二区三区| 国产一区二区三区最好精华液| 国产一区二区三区观看| 国产aⅴ综合色| 91在线观看地址| 伊人激情综合| 99国产精品| 久久av二区| 欧美性xxxxx极品少妇| 欧美久久久久久久久| 日韩精品一区二区三区老鸭窝 | 国语自产精品视频在线看抢先版结局| 亚洲午夜极品| 欧美综合二区| 欧美日韩电影一区| 欧美成人video| 国产日韩成人精品| 亚洲精品午夜久久久| 午夜精品久久久久久久久久久| 久久99国产精品久久99果冻传媒| 国产成人亚洲综合色影视| 色综合一个色综合亚洲|