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

您的位置:首頁技術(shù)文章
文章詳情頁

我喜愛的Java 5.0的五個特性

瀏覽:104日期:2024-06-13 08:25:54
內(nèi)容: 我喜愛的Java 5.0的五個特性作者:David Flanagan, Java in a Nutshell, 第5版的作者04/20/2005 翻譯:xml1123版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:David Flanagan;xml1123原文地址:http://www.onjava.com/pub/a/onjava/2005/04/20/javaIAN5.html中文地址:http://www.matrix.org.cn/resource/article/43/43830_Java5.html關(guān)鍵詞: Java5至今,毫無疑問你已經(jīng)看過不止一篇網(wǎng)上文章列舉了Java5.0的偉大的語言新特性:泛型,標(biāo)注,枚舉類型,自動裝箱,可變參數(shù), for/in循環(huán),甚至靜態(tài)引入。我也認(rèn)為這些是偉大的特性,但是,你已經(jīng)讀過他們了。因此,在此我將集中于你可能沒有聽說過的Java5.0的新API特性。那么,在下面,是我喜歡的Java5.0的五個新API特性。我已經(jīng)在《果殼中的Java》(《Java in a nut shell》)第五版的第五章中介紹過他們。并且我也在我的網(wǎng)站中記錄了其中的一些。那些看完本文后的細(xì)心的讀者會發(fā)現(xiàn)額外的獎勵—第六個特性:很少有人知道的Java5.0支持的新語言語法,當(dāng)然使用者就更少了。我非常喜歡它,因為它很新異。Callable 和 Future 接口我喜歡的第一個特性發(fā)掘自新的java.util.concurrent包。如它的名字暗示的,這是個并行編程工具包。在此有很多要探索的,而我要提的第一喜歡的特性是TimeUnit枚舉類型。TimeUnit讓我感興趣的是它包含有用的時間相關(guān)工具--你通過一個枚舉常量來調(diào)用它們,該常量代表度量時間的單位。例如:TimeUnit.MILLISECONDS.sleep(200);然而,TimeUnit并不是最值得夸獎的。java.util.concurrent最強(qiáng)大的特性之一是它的任務(wù)-執(zhí)行/線程-池結(jié)構(gòu)。ExecutorService接口提供了執(zhí)行任務(wù)的能力。Executors類定義了工廠方法用于獲取使用線程池的ExecutorService的實現(xiàn)。這是強(qiáng)大的要素。我所喜歡的任務(wù)-執(zhí)行框架的部分是它如何表現(xiàn)任務(wù)以及執(zhí)行它的結(jié)果:Callable和Future接口。我們都熟悉用于定義線程的Runnable接口和它的run()方法。Callable像Runnable,但它的方法叫做call(),并且這個方法可以返回一個結(jié)果或者拋出一個異常,而這兩點是Runnable.run()做不到的。Callable是一個泛型,并且它的結(jié)果已經(jīng)參數(shù)化。例如,一個計算BigInteger的任務(wù),是Callable,并且它的方法call()被聲明為返回BigInteger。下面是僅有三行代碼的Callable接口:public interface Callable { V call() throws Exception; }當(dāng)我想要異步執(zhí)行一個Callable任務(wù),我將它傳遞給ExecutorService的submit()方法。submit()的返回值—這也是我喜歡的部分—是一個Future對象:本質(zhì)上是一個對將來某時刻的結(jié)果的“借條。如果我準(zhǔn)備使用我的任務(wù)的結(jié)果,我簡單的調(diào)用Future對象的get()方法即可。如果任務(wù)的執(zhí)行已完成,那么get()立刻返回結(jié)果。否則,它將阻塞直到結(jié)果可用。如果Callable拋出異常,那么get()方法將該異常包裝為ExecutionException并且拋出它。Future還有方法用來對任務(wù)的執(zhí)行進(jìn)行取消和查詢狀態(tài),但是你必須自己查找它們(這些方法)。Future也用了泛型,并且結(jié)果的類型也參數(shù)化了。因此如果我submit()一個Callable來執(zhí)行,我將獲得一個Future< BigInteger>。下面是一個簡短的例子:/** * 這是一個用來計算大素數(shù)的Callable。 */public class PrimeSearch implements Callable{ static Random prng = new SecureRandom(); int n; public PrimeSearch(int bitsize) { n = bitsize; } public BigInteger call() { return BigInteger.probablePrime(n, prng); }}// 嘗試同時計算兩個素數(shù)ExecutorService pool = Executors.newFixedThreadPool(2);Future p = pool.submit(new PrimeSearch(512));Future q = pool.submit(new PrimeSearch(512));// 將兩個素數(shù)相乘來得到一個合數(shù)BigInteger product = p.get().multiply(q.get());可變參數(shù)和自動裝箱我說過我不想談?wù)揓ava5.0的新語言特性,我不會,但是我確實關(guān)注由于可變參數(shù)和自動裝箱才變?yōu)榭赡艿模ɑ蛘弑辉鰪?qiáng)的舊API)新的API。首先,當(dāng)然,是Java5.0的printf風(fēng)格的文本格式化能力,通過java.util.Formatter類和類似String.format()的工具方法。這類文本格式化是最常被引用來支持語言的增加的可變參數(shù)和自動裝箱的那種用例。考慮這個:String s = String.format('%s:%d: %s%n', filename, lineNumber,exception.getMessage());關(guān)于這段代碼沒有什么特別值得注意的東西。我將它列在這是為了說明因為可變參數(shù)和自動裝箱所以比下面的例子顯得簡單:String s = String.format('%s:%d: %s%n', new Object[] { filename, new Integer(lineNumber),exception.getMessage()});可變參數(shù)和自動裝箱還對java.lang.reflect API有一個實質(zhì)性的影響。那就是當(dāng)查找和調(diào)用方法時不再需要類和對象數(shù)組:Method m = c.getMethod('put', Object.class,Object.class); m.invoke(map, 'key', 'value');如果我必須選擇一個最喜歡的可變參數(shù)方法,那么,將是java.util.Arrays.asList()。這個方法真是個用于創(chuàng)建不變的對象列表的方便的工廠方法。它接受任何數(shù)量的類型T的參數(shù)并且將它們作為List返回:List smallPrimes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19);能力我們在上面談?wù)摿薘unnable和Callable,并且你毫無疑問已經(jīng)聽說過重要的Comparable, Serializable,和Cloneable接口。Java5.0新增加了五個重要的能力接口。第一個,當(dāng)然,是java.lang.Iterable。你或許知道Java5.0新的for/in循環(huán)可以迭代數(shù)組和集合。你可能不知道它能夠?qū)θ魏螌崿F(xiàn)了可迭代(Iterable)接口的對象工作。因此,如果你想讓一個不是集合的數(shù)據(jù)結(jié)構(gòu)可以簡單地迭代,只需實現(xiàn)Iterable接口。你要做的就是增加一個返回java.util.Iterator 的iterator()方法。當(dāng)然,寫這個迭代器(Iterator)可能不是那么簡單的。下面的代碼是一個實現(xiàn)了Iterable(是的,Iterable是泛型的)的文本文件類,因而允許文本文件可以用for/in循環(huán)逐行的迭代。你可以用類似下面的代碼使用它:TextFile textfile = new TextFile(new File(f), 'UTF-8'); int lineNumber = 0; for(String line : textfile) System.out.printf('%6d: %s%n', ++lineNumber, line);下面是TextFile的代碼。注意,迭代器不嘗試檢測對底層文件的并發(fā)的修改。如果你想自己做,看一看java.nio.channels.FileLock。import java.io.*;import java.util.Iterator;public class TextFile implements Iterable { File f; String charsetName; public TextFile(File f, String charsetName) throws IOException { this.f = f; this.charsetName = charsetName; if (!f.exists()) throw new FileNotFoundException(f.getPath()); if (!f.canRead()) throw new IOException('Can't read: ' + f.getPath()); } public Iterator iterator() { try { return new TextFileIterator(f, charsetName); } catch(IOException e) { throw new IllegalArgumentException(e); } } static class TextFileIterator implements Iterator { BufferedReader in; String nextline; boolean closed = false; public TextFileIterator(File f, String charsetName) throws IOException { InputStream fis = new FileInputStream(f); Reader isr = new InputStreamReader(fis, charsetName); in = new BufferedReader(isr); getNextLine(); } public boolean hasNext() { return nextline != null; } public String next() { String returnValue = nextline; getNextLine(); return returnValue; } public void remove() { throw new UnsupportedOperationException(); } void getNextLine() { if (!closed) { try { nextline = in.readLine(); } catch(IOException e) { throw new IllegalArgumentException(e); } if (nextline == null) { try { in.close(); } catch(IOException ignored) {} closed = true; } } } }}Iterable是到目前為止最重要的新能力接口,但是其它的也是非常的漂亮。接下來,我們碰到j(luò)ava.lang.Appendable。一個Appendable對象可以追加字符或字符序列(或者一個字符序列的子序列)。實現(xiàn)者包括StringBuffer和StringBuilder(如果你還沒有聽說過它,一定要看一看),Writer(及其子類),PrintStream,還有java.nio.CharBuffer。將可追加性從這些類中分離出來成為Appendable接口,使得新的java.util.Formatter類更強(qiáng)大:它能將文本格式化為任何可追加的對象,包括你自己的實現(xiàn)。(練習(xí)留給讀者:你能否將上面的TextFile類變得既可迭代又可追加么?)。java.lang.Readable接口和Appendable相反:一個可讀對象可以將字符傳輸給給定的CharBuffer。java.io.Reader和它的全部子類都是可讀的(當(dāng)然了),CharBuffer本身也一樣。就像Appendable是為了java.util.Formatter的利益而創(chuàng)造,Readable是為了java.util.Scanner的利益而創(chuàng)造。(Java5.0增加了Scanner,連同F(xiàn)ormatter。這是Java對C的scanf()函數(shù)的適應(yīng),但是它(Scanner)不像Formatter之對應(yīng)于printf()的關(guān)系那樣密切。)我想討論的最后兩個能力接口是java.io.Closeable和java.io.Flushable。如它們的名字暗示的,它們趨向于被任何類實現(xiàn),通過一個close()或者flush()方法。Closeable被所有的輸入和輸出流類,RandomAccessFile和Formatter實現(xiàn)。Flushable被輸出流類和Formatter實現(xiàn)。這些接口也是為了Formatter類的利益而定義。注意,Appendable對象(像StringBuilder)不總是可關(guān)閉或者可沖刷(flushable)。通過將可關(guān)閉性和可沖刷性分解出來成為這些接口,F(xiàn)ormatter的close()和flush()方法能夠決定它們操作的Appendable對象是否需要被關(guān)閉或被沖刷。(Java5.0還增加了第六個能力接口,并且它也是有關(guān)Formatter類的。那些想要控制它們的實例怎樣被格式化的類可以實現(xiàn)java.util.Formattable接口。然而這個接口的API是難用的,我不想談?wù)撍#〡Override毫無疑問,你已經(jīng)聽說過能用元數(shù)據(jù)標(biāo)注Java5.0的類型和方法。但是你可能不熟悉增加到j(luò)ava.lang的標(biāo)準(zhǔn)標(biāo)注類型。我喜歡的第四個特性就是java.lang.Override標(biāo)注。當(dāng)你寫一個方法準(zhǔn)備覆蓋另一個的方法時,用@Override來標(biāo)注它,這樣編譯器會進(jìn)行檢查來確保你確實,實際上,覆蓋了你想覆蓋的方法。如果你拼寫錯了方法名字或者弄錯了方法參數(shù),那么你實際上并沒有覆蓋那個你認(rèn)為你覆蓋了的方法。這樣就造成了一個如果不用@Override很難捕捉的臭蟲。我所以知道是因為我的關(guān)于Java1.4的新API特性的文章就講到了這個臭蟲,并且這個錯誤至少有一年一直沒被檢測到(至少沒有被報告)。在那篇文章中,你可以在第一頁結(jié)尾看到我犯的錯誤。那篇文章現(xiàn)在包含一個鏈接到我的博客入口,在那里我改正了這個臭蟲并且在代碼中增加了@Override聲明。MatchResult我喜歡的Java5.0的最后一個特性是java.util.regex.MatchResult。對于用于正則表達(dá)式的模式/匹配API我從來沒有真正非常滿意。Java5.0增加的MatchResult在讓我大大地更加滿意。當(dāng)使用一個不太平凡的模式(Pattern),每次調(diào)用匹配者(Matcher)的find()方法會生成許多狀態(tài):開始位置,結(jié)束位置,匹配的文本,同時還有模式的開始,結(jié)束,每個子表達(dá)式的文本。在Java5.0以前,你只能從Matcher獲取它們,通過在調(diào)用find()后再調(diào)用start(),end(),還有g(shù)roup(),如果需要的話。然而,到了Java5.0,你可以只調(diào)用toMatchResult()來獲取MatchResult對象再獲取全部的狀態(tài),MatchResult對象可以保存并且可以以后再檢查。MatchResult像Matcher一樣有start(),end(),以及group()方法,并且,實際上,Matcher現(xiàn)在實現(xiàn)了MatchResult。這里是一個有用的返回MatchResult的方法:public static List findAll(Pattern pattern,CharSequence text) { List results = new ArrayList(); Matcher m = pattern.matcher(text); while(m.find()) results.add(m.toMatchResult()); return results;}還有使用這個方法的代碼:List results = findAll(pattern, text);for(MatchResult r : results) { System.out.printf('Found '%s' at (%d,%d)%n', r.group(), r.start(), r.end());}十六進(jìn)制浮點數(shù)字面值我承諾談?wù)揓ava5.0的最晦澀的新語言特性。這就是:十六進(jìn)制格式的浮點常量!這里是奇異的詳情:一個十六進(jìn)制符號的浮點常量以0X或者0x開頭。隨后的十六進(jìn)制數(shù)字形成了數(shù)的基數(shù)。關(guān)鍵是這些數(shù)字可以包含一個小數(shù)點(一個十六進(jìn)制小數(shù)點?)。在基數(shù)后面是指數(shù),是必需的。十六進(jìn)制浮點常量使用p或者P而不是e或者E來引入指數(shù)。(想一下“冪來幫助記憶)。P或者P后面是指數(shù),必須是一個十進(jìn)制數(shù),而不是十六進(jìn)制數(shù)。而且這是個以二為根的指數(shù),而不是以十為根。那就是,表示基數(shù)要乘以的2的冪。最后,整個常量可以跟隨一個f或者F來表示一個浮點常量,或者一個d或者D表示一個雙精度常量,就像一個十進(jìn)制浮點數(shù)一樣。下面是一些例子:double x = 0XaP0; // 10 * 2^0 = 10.0 double y = 0XfP2D; // 15 * 2^2 = 60.0 float z = 0Xf.aP1F; // (15 + 10/16ths) * 2^1 = 31.25f // 用十進(jìn)制來打印 System.out.printf('%f %f %f%n', x, y, z); // 用十六進(jìn)制來打印 System.out.printf('%a %a %a%n', x, y, z);為什么Sun要對語言做這些?5.0的發(fā)行說明說:為了允許特定浮點值實現(xiàn)精確及可預(yù)見的規(guī)范,十六進(jìn)制符號可用于Float和Double的浮點字面值和字符串到浮點數(shù)的轉(zhuǎn)換方法中。這點是合理的。十進(jìn)制小數(shù)像0.1是不能精確地用浮點格式表示的,并且如果你真的需要確切知道在一個浮點或者雙精度值中比特位是怎么設(shè)的,那么你真的想要一個十六進(jìn)制字面值。例如,F(xiàn)loat.MAX_VALUE的Javadoc指出最大的浮點值是0x1.fffffeP+127f。如果你知道并且喜歡IEEE-754浮點標(biāo)準(zhǔn),那么十六進(jìn)制浮點字段值或許是你喜歡的一個特性。我只是認(rèn)為他們有趣。2005年3月,O’Relly媒體公司,發(fā)行了《Java in a Nutshell》第五版。 你可以看看對該書的簡介。 想要更多信息,或者要預(yù)訂該書,點擊這里。David Flanagan 是O’Relly很多書的作者,包括果《殼中的Java》(Java in a Nutshell), 《果殼中的Java例子》(Java Examples in a Nutshell),《果殼中的Java基礎(chǔ)類》( Java Foundation Classes in a Nutshell),《 JavaScript權(quán)威指南》(JavaScript: The Definitive Guide), 以及《JavaScript 袖珍參考》(JavaScript Pocket Reference)。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 我喜愛的Java 5.0的五個特性作者:David Flanagan, Java in a Nutshell, 第5版的作者04/20/2005 翻譯:xml1123版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:David Flanagan;xml1123原文地址:http://www.on
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 雪花制冰机(实验室雪花制冰机)百科 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 北京公寓出租网-北京酒店式公寓出租平台 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 软启动器-上海能曼电气有限公司| 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 电动高压冲洗车_价格-江苏速利达机车有限公司| 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | SRRC认证|CCC认证|CTA申请_IMEI|MAC地址注册-英利检测 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 搪玻璃冷凝器_厂家-越宏化工设备 | 学生作文网_中小学生作文大全与写作指导 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 |