国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

我喜愛的Java 5.0的五個特性

瀏覽:73日期: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)然使用者就更少了。我非常喜歡它,因?yàn)樗苄庐悺allable 和 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的實(shí)現(xiàn)。這是強(qiáng)大的要素。我所喜歡的任務(wù)-執(zhí)行框架的部分是它如何表現(xiàn)任務(wù)以及執(zhí)行它的結(jié)果:Callable和Future接口。我們都熟悉用于定義線程的Runnable接口和它的run()方法。Callable像Runnable,但它的方法叫做call(),并且這個方法可以返回一個結(jié)果或者拋出一個異常,而這兩點(diǎn)是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的新語言特性,我不會,但是我確實(shí)關(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)于這段代碼沒有什么特別值得注意的東西。我將它列在這是為了說明因?yàn)榭勺儏?shù)和自動裝箱所以比下面的例子顯得簡單:String s = String.format('%s:%d: %s%n', new Object[] { filename, new Integer(lineNumber),exception.getMessage()});可變參數(shù)和自動裝箱還對java.lang.reflect API有一個實(shí)質(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ū)θ魏螌?shí)現(xiàn)了可迭代(Iterable)接口的對象工作。因此,如果你想讓一個不是集合的數(shù)據(jù)結(jié)構(gòu)可以簡單地迭代,只需實(shí)現(xiàn)Iterable接口。你要做的就是增加一個返回java.util.Iterator 的iterator()方法。當(dāng)然,寫這個迭代器(Iterator)可能不是那么簡單的。下面的代碼是一個實(shí)現(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對象可以追加字符或字符序列(或者一個字符序列的子序列)。實(shí)現(xiàn)者包括StringBuffer和StringBuilder(如果你還沒有聽說過它,一定要看一看),Writer(及其子類),PrintStream,還有java.nio.CharBuffer。將可追加性從這些類中分離出來成為Appendable接口,使得新的java.util.Formatter類更強(qiáng)大:它能將文本格式化為任何可追加的對象,包括你自己的實(shí)現(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。如它們的名字暗示的,它們趨向于被任何類實(shí)現(xiàn),通過一個close()或者flush()方法。Closeable被所有的輸入和輸出流類,RandomAccessFile和Formatter實(shí)現(xiàn)。Flushable被輸出流類和Formatter實(shí)現(xiàn)。這些接口也是為了Formatter類的利益而定義。注意,Appendable對象(像StringBuilder)不總是可關(guān)閉或者可沖刷(flushable)。通過將可關(guān)閉性和可沖刷性分解出來成為這些接口,F(xiàn)ormatter的close()和flush()方法能夠決定它們操作的Appendable對象是否需要被關(guān)閉或被沖刷。(Java5.0還增加了第六個能力接口,并且它也是有關(guān)Formatter類的。那些想要控制它們的實(shí)例怎樣被格式化的類可以實(shí)現(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í),實(shí)際上,覆蓋了你想覆蓋的方法。如果你拼寫錯了方法名字或者弄錯了方法參數(shù),那么你實(shí)際上并沒有覆蓋那個你認(rèn)為你覆蓋了的方法。這樣就造成了一個如果不用@Override很難捕捉的臭蟲。我所以知道是因?yàn)槲业年P(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()方法,并且,實(shí)際上,Matcher現(xiàn)在實(shí)現(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)制浮點(diǎn)數(shù)字面值我承諾談?wù)揓ava5.0的最晦澀的新語言特性。這就是:十六進(jìn)制格式的浮點(diǎn)常量!這里是奇異的詳情:一個十六進(jìn)制符號的浮點(diǎn)常量以0X或者0x開頭。隨后的十六進(jìn)制數(shù)字形成了數(shù)的基數(shù)。關(guān)鍵是這些數(shù)字可以包含一個小數(shù)點(diǎn)(一個十六進(jìn)制小數(shù)點(diǎn)?)。在基數(shù)后面是指數(shù),是必需的。十六進(jìn)制浮點(diǎn)常量使用p或者P而不是e或者E來引入指數(shù)。(想一下“冪來幫助記憶)。P或者P后面是指數(shù),必須是一個十進(jìn)制數(shù),而不是十六進(jìn)制數(shù)。而且這是個以二為根的指數(shù),而不是以十為根。那就是,表示基數(shù)要乘以的2的冪。最后,整個常量可以跟隨一個f或者F來表示一個浮點(diǎn)常量,或者一個d或者D表示一個雙精度常量,就像一個十進(jìn)制浮點(diǎ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ā)行說明說:為了允許特定浮點(diǎn)值實(shí)現(xiàn)精確及可預(yù)見的規(guī)范,十六進(jìn)制符號可用于Float和Double的浮點(diǎn)字面值和字符串到浮點(diǎn)數(shù)的轉(zhuǎn)換方法中。這點(diǎn)是合理的。十進(jìn)制小數(shù)像0.1是不能精確地用浮點(diǎn)格式表示的,并且如果你真的需要確切知道在一個浮點(diǎn)或者雙精度值中比特位是怎么設(shè)的,那么你真的想要一個十六進(jìn)制字面值。例如,F(xiàn)loat.MAX_VALUE的Javadoc指出最大的浮點(diǎn)值是0x1.fffffeP+127f。如果你知道并且喜歡IEEE-754浮點(diǎn)標(biāo)準(zhǔn),那么十六進(jìn)制浮點(diǎn)字段值或許是你喜歡的一個特性。我只是認(rèn)為他們有趣。2005年3月,O’Relly媒體公司,發(fā)行了《Java in a Nutshell》第五版。 你可以看看對該書的簡介。 想要更多信息,或者要預(yù)訂該書,點(diǎn)擊這里。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)文章:
主站蜘蛛池模板: 亚洲免费影院 | 国产精品18久久久久久小说 | 亚洲成人手机在线观看 | 免费观看久久 | 国产成人精品福利网站在线观看 | 草久在线播放 | 欧美一级α片毛片免费观看 | 三级毛片大全 | 成人看片黄a毛片 | 一级毛片儿 | 国产精品久久久久影院色老大 | 国产大片一区 | 亚洲精品永久一区 | 国内视频一区 | 草草影院私人免费入口 | 亚洲欧美激情精品一区二区 | 国产一区二区三区毛片 | 国产性精品 | 国产毛片久久国产 | 国产亚洲综合在线 | 成年女人毛片免费视频永久vip | 偷看各类wc女厕嘘在线观看 | 97影院理伦在线观看 | 亚洲免费久久 | 国产系列在线 | 国产成人精品无缓存在线播放 | 天天激情站| 韩国主播19福利视频在线 | 久久国产精品99久久小说 | 欧美视频久久 | 美女网站免费观看视频 | mm在线精品视频 | 九草在线 | 免费永久在线观看黄网 | 日韩在线免费 | 久久亚洲精品中文字幕 | 国产一级片播放 | 久久免视频 | 国产三片高清在线观看 | 手机看片福利永久 | 久草看片 |