电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:114日期: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
相關文章:
主站蜘蛛池模板: 代办建筑资质升级-建筑资质延期就找上海国信启航 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 | 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 不锈钢水管-不锈钢燃气管-卫生级不锈钢管件-不锈钢食品级水管-广东双兴新材料集团有限公司 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 郑州外墙清洗_郑州玻璃幕墙清洗_郑州开荒保洁-河南三恒清洗服务有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 半容积式换热器_北京浮动盘管换热器厂家|北京亿丰上达 | 底部填充胶_电子封装胶_芯片封装胶_芯片底部填充胶厂家-东莞汉思新材料 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 |