色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

我喜愛的Java 5.0的五個特性

瀏覽:74日期:2024-06-13 08:25:54
內容: 我喜愛的Java 5.0的五個特性作者:David Flanagan, Java in a Nutshell, 第5版的作者04/20/2005 翻譯:xml1123版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者: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關鍵詞: Java5至今,毫無疑問你已經看過不止一篇網上文章列舉了Java5.0的偉大的語言新特性:泛型,標注,枚舉類型,自動裝箱,可變參數, for/in循環,甚至靜態引入。我也認為這些是偉大的特性,但是,你已經讀過他們了。因此,在此我將集中于你可能沒有聽說過的Java5.0的新API特性。那么,在下面,是我喜歡的Java5.0的五個新API特性。我已經在《果殼中的Java》(《Java in a nut shell》)第五版的第五章中介紹過他們。并且我也在我的網站中記錄了其中的一些。那些看完本文后的細心的讀者會發現額外的獎勵—第六個特性:很少有人知道的Java5.0支持的新語言語法,當然使用者就更少了。我非常喜歡它,因為它很新異。Callable 和 Future 接口我喜歡的第一個特性發掘自新的java.util.concurrent包。如它的名字暗示的,這是個并行編程工具包。在此有很多要探索的,而我要提的第一喜歡的特性是TimeUnit枚舉類型。TimeUnit讓我感興趣的是它包含有用的時間相關工具--你通過一個枚舉常量來調用它們,該常量代表度量時間的單位。例如:TimeUnit.MILLISECONDS.sleep(200);然而,TimeUnit并不是最值得夸獎的。java.util.concurrent最強大的特性之一是它的任務-執行/線程-池結構。ExecutorService接口提供了執行任務的能力。Executors類定義了工廠方法用于獲取使用線程池的ExecutorService的實現。這是強大的要素。我所喜歡的任務-執行框架的部分是它如何表現任務以及執行它的結果:Callable和Future接口。我們都熟悉用于定義線程的Runnable接口和它的run()方法。Callable像Runnable,但它的方法叫做call(),并且這個方法可以返回一個結果或者拋出一個異常,而這兩點是Runnable.run()做不到的。Callable是一個泛型,并且它的結果已經參數化。例如,一個計算BigInteger的任務,是Callable,并且它的方法call()被聲明為返回BigInteger。下面是僅有三行代碼的Callable接口:public interface Callable { V call() throws Exception; }當我想要異步執行一個Callable任務,我將它傳遞給ExecutorService的submit()方法。submit()的返回值—這也是我喜歡的部分—是一個Future對象:本質上是一個對將來某時刻的結果的“借條。如果我準備使用我的任務的結果,我簡單的調用Future對象的get()方法即可。如果任務的執行已完成,那么get()立刻返回結果。否則,它將阻塞直到結果可用。如果Callable拋出異常,那么get()方法將該異常包裝為ExecutionException并且拋出它。Future還有方法用來對任務的執行進行取消和查詢狀態,但是你必須自己查找它們(這些方法)。Future也用了泛型,并且結果的類型也參數化了。因此如果我submit()一個Callable來執行,我將獲得一個Future< BigInteger>。下面是一個簡短的例子:/** * 這是一個用來計算大素數的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); }}// 嘗試同時計算兩個素數ExecutorService pool = Executors.newFixedThreadPool(2);Future p = pool.submit(new PrimeSearch(512));Future q = pool.submit(new PrimeSearch(512));// 將兩個素數相乘來得到一個合數BigInteger product = p.get().multiply(q.get());可變參數和自動裝箱我說過我不想談論Java5.0的新語言特性,我不會,但是我確實關注由于可變參數和自動裝箱才變為可能的(或者被增強的舊API)新的API。首先,當然,是Java5.0的printf風格的文本格式化能力,通過java.util.Formatter類和類似String.format()的工具方法。這類文本格式化是最常被引用來支持語言的增加的可變參數和自動裝箱的那種用例。考慮這個:String s = String.format('%s:%d: %s%n', filename, lineNumber,exception.getMessage());關于這段代碼沒有什么特別值得注意的東西。我將它列在這是為了說明因為可變參數和自動裝箱所以比下面的例子顯得簡單:String s = String.format('%s:%d: %s%n', new Object[] { filename, new Integer(lineNumber),exception.getMessage()});可變參數和自動裝箱還對java.lang.reflect API有一個實質性的影響。那就是當查找和調用方法時不再需要類和對象數組:Method m = c.getMethod('put', Object.class,Object.class); m.invoke(map, 'key', 'value');如果我必須選擇一個最喜歡的可變參數方法,那么,將是java.util.Arrays.asList()。這個方法真是個用于創建不變的對象列表的方便的工廠方法。它接受任何數量的類型T的參數并且將它們作為List返回:List smallPrimes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19);能力我們在上面談論了Runnable和Callable,并且你毫無疑問已經聽說過重要的Comparable, Serializable,和Cloneable接口。Java5.0新增加了五個重要的能力接口。第一個,當然,是java.lang.Iterable。你或許知道Java5.0新的for/in循環可以迭代數組和集合。你可能不知道它能夠對任何實現了可迭代(Iterable)接口的對象工作。因此,如果你想讓一個不是集合的數據結構可以簡單地迭代,只需實現Iterable接口。你要做的就是增加一個返回java.util.Iterator 的iterator()方法。當然,寫這個迭代器(Iterator)可能不是那么簡單的。下面的代碼是一個實現了Iterable(是的,Iterable是泛型的)的文本文件類,因而允許文本文件可以用for/in循環逐行的迭代。你可以用類似下面的代碼使用它: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的代碼。注意,迭代器不嘗試檢測對底層文件的并發的修改。如果你想自己做,看一看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是到目前為止最重要的新能力接口,但是其它的也是非常的漂亮。接下來,我們碰到java.lang.Appendable。一個Appendable對象可以追加字符或字符序列(或者一個字符序列的子序列)。實現者包括StringBuffer和StringBuilder(如果你還沒有聽說過它,一定要看一看),Writer(及其子類),PrintStream,還有java.nio.CharBuffer。將可追加性從這些類中分離出來成為Appendable接口,使得新的java.util.Formatter類更強大:它能將文本格式化為任何可追加的對象,包括你自己的實現。(練習留給讀者:你能否將上面的TextFile類變得既可迭代又可追加么?)。java.lang.Readable接口和Appendable相反:一個可讀對象可以將字符傳輸給給定的CharBuffer。java.io.Reader和它的全部子類都是可讀的(當然了),CharBuffer本身也一樣。就像Appendable是為了java.util.Formatter的利益而創造,Readable是為了java.util.Scanner的利益而創造。(Java5.0增加了Scanner,連同Formatter。這是Java對C的scanf()函數的適應,但是它(Scanner)不像Formatter之對應于printf()的關系那樣密切。)我想討論的最后兩個能力接口是java.io.Closeable和java.io.Flushable。如它們的名字暗示的,它們趨向于被任何類實現,通過一個close()或者flush()方法。Closeable被所有的輸入和輸出流類,RandomAccessFile和Formatter實現。Flushable被輸出流類和Formatter實現。這些接口也是為了Formatter類的利益而定義。注意,Appendable對象(像StringBuilder)不總是可關閉或者可沖刷(flushable)。通過將可關閉性和可沖刷性分解出來成為這些接口,Formatter的close()和flush()方法能夠決定它們操作的Appendable對象是否需要被關閉或被沖刷。(Java5.0還增加了第六個能力接口,并且它也是有關Formatter類的。那些想要控制它們的實例怎樣被格式化的類可以實現java.util.Formattable接口。然而這個接口的API是難用的,我不想談論它。)@Override毫無疑問,你已經聽說過能用元數據標注Java5.0的類型和方法。但是你可能不熟悉增加到java.lang的標準標注類型。我喜歡的第四個特性就是java.lang.Override標注。當你寫一個方法準備覆蓋另一個的方法時,用@Override來標注它,這樣編譯器會進行檢查來確保你確實,實際上,覆蓋了你想覆蓋的方法。如果你拼寫錯了方法名字或者弄錯了方法參數,那么你實際上并沒有覆蓋那個你認為你覆蓋了的方法。這樣就造成了一個如果不用@Override很難捕捉的臭蟲。我所以知道是因為我的關于Java1.4的新API特性的文章就講到了這個臭蟲,并且這個錯誤至少有一年一直沒被檢測到(至少沒有被報告)。在那篇文章中,你可以在第一頁結尾看到我犯的錯誤。那篇文章現在包含一個鏈接到我的博客入口,在那里我改正了這個臭蟲并且在代碼中增加了@Override聲明。MatchResult我喜歡的Java5.0的最后一個特性是java.util.regex.MatchResult。對于用于正則表達式的模式/匹配API我從來沒有真正非常滿意。Java5.0增加的MatchResult在讓我大大地更加滿意。當使用一個不太平凡的模式(Pattern),每次調用匹配者(Matcher)的find()方法會生成許多狀態:開始位置,結束位置,匹配的文本,同時還有模式的開始,結束,每個子表達式的文本。在Java5.0以前,你只能從Matcher獲取它們,通過在調用find()后再調用start(),end(),還有group(),如果需要的話。然而,到了Java5.0,你可以只調用toMatchResult()來獲取MatchResult對象再獲取全部的狀態,MatchResult對象可以保存并且可以以后再檢查。MatchResult像Matcher一樣有start(),end(),以及group()方法,并且,實際上,Matcher現在實現了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());}十六進制浮點數字面值我承諾談論Java5.0的最晦澀的新語言特性。這就是:十六進制格式的浮點常量!這里是奇異的詳情:一個十六進制符號的浮點常量以0X或者0x開頭。隨后的十六進制數字形成了數的基數。關鍵是這些數字可以包含一個小數點(一個十六進制小數點?)。在基數后面是指數,是必需的。十六進制浮點常量使用p或者P而不是e或者E來引入指數。(想一下“冪來幫助記憶)。P或者P后面是指數,必須是一個十進制數,而不是十六進制數。而且這是個以二為根的指數,而不是以十為根。那就是,表示基數要乘以的2的冪。最后,整個常量可以跟隨一個f或者F來表示一個浮點常量,或者一個d或者D表示一個雙精度常量,就像一個十進制浮點數一樣。下面是一些例子: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 // 用十進制來打印 System.out.printf('%f %f %f%n', x, y, z); // 用十六進制來打印 System.out.printf('%a %a %a%n', x, y, z);為什么Sun要對語言做這些?5.0的發行說明說:為了允許特定浮點值實現精確及可預見的規范,十六進制符號可用于Float和Double的浮點字面值和字符串到浮點數的轉換方法中。這點是合理的。十進制小數像0.1是不能精確地用浮點格式表示的,并且如果你真的需要確切知道在一個浮點或者雙精度值中比特位是怎么設的,那么你真的想要一個十六進制字面值。例如,Float.MAX_VALUE的Javadoc指出最大的浮點值是0x1.fffffeP+127f。如果你知道并且喜歡IEEE-754浮點標準,那么十六進制浮點字段值或許是你喜歡的一個特性。我只是認為他們有趣。2005年3月,O’Relly媒體公司,發行了《Java in a Nutshell》第五版。 你可以看看對該書的簡介。 想要更多信息,或者要預訂該書,點擊這里。David Flanagan 是O’Relly很多書的作者,包括果《殼中的Java》(Java in a Nutshell), 《果殼中的Java例子》(Java Examples in a Nutshell),《果殼中的Java基礎類》( Java Foundation Classes in a Nutshell),《 JavaScript權威指南》(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版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:David Flanagan;xml1123原文地址:http://www.on
標簽: Java
相關文章:
主站蜘蛛池模板: 久久r这里只有精品 | 日韩二区三区 | 欧美精品一区二区精品久久 | 九九精品视频一区在线 | 日本免费一区二区三区毛片 | 欧美一级毛片一 | 久久99精品久久久久久野外 | 3级黄色| 99福利网 | 国产精品伦理久久久久 | 国产午夜不卡在线观看视频666 | 97视频在线视频 | 久久五月女厕所一区二区 | 亚洲综合欧美综合 | 香蕉网影院在线观看免费 | 国产美女自拍视频 | 国产成人精品午夜免费 | 亚洲欧美第一 | 国内精品久久久久影院免费 | 亚洲在线一区二区三区 | 国产精品久久久久久久hd | 毛片图片 | 国产精品久久久久久一区二区 | 欧美日韩精品乱国产 | 性夜影院爽黄a爽免费看网站 | 国内精品伊人久久久影视 | 亚洲国产韩国一区二区 | 欧美毛片a级毛片免费观 | 色偷偷成人| 国产欧美日韩精品第一区 | 中国农村一级毛片 | 国产精品亚洲一区二区三区在线观看 | 九九精品视频在线播放8 | 欧美69精品国产成人 | 好看毛片 | 特级片在线观看 | 日韩欧美在线观看视频一区二区 | 怡红院在线a男人的天堂 | 国产免费爱在线观看视频 | 欧美一级毛片片免费 | 欧美在线视频免费 |