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

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

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

瀏覽:113日期: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
相關文章:
主站蜘蛛池模板: 贴片电容-贴片电阻-二三极管-国巨|三星|风华贴片电容代理商-深圳伟哲电子 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 聚合氯化铝价格_聚合氯化铝厂家_pac絮凝剂-唐达净水官网 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 汕头市盛大文化传播有限公司,www.11400.cc | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 重庆轻质隔墙板-重庆安吉升科技有限公司| 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 楼承板-钢筋楼承板-闭口楼承板-无锡优贝斯楼承板厂 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 微动开关厂家-东莞市德沃电子科技有限公司 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 |