Java7 –回顾
我開始寫博客文章,介紹即將發(fā)布的Java8版本中的新增功能 ,并認(rèn)為我將從快速回顧一下Java7帶給我們的內(nèi)容開始。
Java7于2011年7月發(fā)布,被描述為“更具進(jìn)化性而非革命性”。
“有一些重大的改進(jìn),但是并沒有真正令人驚嘆或突破性的功能。” – Oracle首席Java架構(gòu)師Mark Reinhold
例如,它不包含被大肆宣傳的lambda表達(dá)式。 盡管如此,它確實為Java語言帶來了許多其他巧妙的補(bǔ)充。 您可以在http://docs.oracle.com/javase/7/docs/上找到更多內(nèi)容,或者繼續(xù)閱讀我的摘要。
Java7的重點(diǎn)包括:
- 項目硬幣
- 開關(guān)中的弦
- 資源試一試
- 多發(fā)球和更精確的重新拋出
- 鉆石操作員
- 二進(jìn)制整數(shù)文字
- 數(shù)字文字下劃線
- 新的輸入/輸出功能
- Fork&Join /并發(fā)實用程序
項目幣
項目代幣是“零錢”的雙關(guān)語,包含一些次要但有用的功能,包括:
開關(guān)中的弦
在Java 7之前的版本中,switch語句適用于原始類型或枚舉類型。 Java 7引入了我們可以在Switch語句中使用的另一種類型: String類型。 假設(shè)我們有一個根據(jù)字符串狀態(tài)字段處理交易的要求。 到目前為止,我們以前都是通過使用if-else語句來實現(xiàn)的。
private void processTrade_UsingIfs(Trade t) {String status = t.getStatus();if (status.equalsIgnoreCase("New")) {setupNewTrade(t);} else if (status.equalsIgnoreCase("Execute")) {executeTrade(t);} else if (status.equalsIgnoreCase("Pending")) {processTrade(t);}}在Java7中,我們可以使用switch語句執(zhí)行相同的操作:
public void processTrade_UsingSwitch(Trade t) {String status = t.getStatus();switch (status) {case "New":setupNewTrade(t);break;case "Execute":executeTrade(t);break;case "Pending":processTrade(t);break;default:break;}}嘗試語句中的自動資源管理
現(xiàn)在,您可以在try塊中聲明一個將自動關(guān)閉的資源。 例如以前必須要做的事:
public void oldTry() {FileReader fileReader = null;BufferedReader inputStream = null;try {fileReader = new FileReader("java7.txt");inputStream = new BufferedReader(fileReader);String line = inputStream.readLine();System.out.println(line);} catch (IOException e) {//typically log or rethrow} finally {//all resources need to be manually closedtry {fileReader.close();inputStream.close();} catch (IOException e) {//typically ignore}}}但是,現(xiàn)在在Java 7中,try-with-resources語句可確保在語句末尾關(guān)閉每個資源。
public void newTry() {try (FileReader fileReader = new FileReader("java7.txt");BufferedReader inputStream = new BufferedReader(fileReader)) {String line = inputStream.readLine();System.out.println(line); } catch (IOException e) {//typically log or rethrow}//no finally block to close resources required}資源的聲明出現(xiàn)在try關(guān)鍵字之后的括號內(nèi)。
任何實現(xiàn)java.lang.AutoCloseable的對象(包括所有實現(xiàn)java.io.Closeable的對象)都可以用作資源。 無論try語句正常完成還是突然完成,資源都將關(guān)閉
多發(fā)球和更精確的重新拋出
多抓
public void oldMultiCatch() {try {methodThatThrowsThreeExceptions();} catch (ExceptionOne e) {// log and deal with ExceptionOne} catch (ExceptionTwo e) {// log and deal with ExceptionTwo} catch (ExceptionThree e) {// log and deal with ExceptionThree}}public void newMultiCatch() {try {methodThatThrowsThreeExceptions();} catch (ExceptionOne | ExceptionTwo | ExceptionThree e) {// log and deal with all Exceptions}}public void newMultiMultiCatch() {try {methodThatThrowsThreeExceptions();} catch (ExceptionOne e) {// log and deal with ExceptionOne} catch (ExceptionTwo | ExceptionThree e) {// log and deal with ExceptionTwo and ExceptionThree}}更精確的重新拋出
Java SE 7編譯器對重新拋出的異常執(zhí)行更精確的分析,使您可以在方法聲明的throws子句中指定比在方法主體的catch / throws中使用的更特定的異常類型。
以前,我們必須做這樣的事情:
static class FirstException extends Exception { }static class SecondException extends Exception { }public void rethrowException_PreJava7(String exceptionName) throws Exception {try {if (exceptionName.equals("First")) {throw new FirstException();} else {throw new SecondException();}} catch (Exception e) {throw e;}}注意我們?nèi)绾卧趖hrows子句中聲明更通用的Exception。 在Java7中,我們可以將其更改為:
public void rethrowException_PostJava7(String exceptionName) throws FirstException, SecondException {try {if (exceptionName.equals("First")) {throw new FirstException();} else {throw new SecondException();}} catch (Exception e) {throw e;}}鉆石操作員
Diamond運(yùn)算符簡化了涉及泛型的構(gòu)造函數(shù)調(diào)用。 假設(shè)您要創(chuàng)建一個字符串ID映射來交易對象。 原來的方法是:
Map<String, Trade> trades = new TreeMap<String, Trade>();但是右側(cè)似乎有點(diǎn)多余。 編譯器可以通過查看左側(cè)的聲明來推斷類型嗎? 在Java7中可以,代碼變?yōu)?#xff1a;
Map<String, Trade> trades = new TreeMap<>();這是一個不錯的但次要的方便–使用Guava庫已經(jīng)可以很好地處理它。 例如:
Map<String, Trade> trades = Maps.newTreeMap();二進(jìn)制整數(shù)文字
如果您在代碼中處理二進(jìn)制文件,則很有用。 例如,您現(xiàn)在可以執(zhí)行以下操作:
int three = 0b101;請注意0??b(或0B)前綴,以將數(shù)字標(biāo)識為二進(jìn)制文字。
允許在數(shù)字文字中使用下劃線
我也不認(rèn)為這個意義太大,但是在某些情況下可能有用。 例如:
long creditCardNumber = 1234_5678_9012_3456L;Fork&Join /并發(fā)實用程序(JSR 166)
Fork / Join框架專注于使用計算機(jī)中可用的所有處理資源來提高應(yīng)用程序的性能。 它是為可以遞歸分解為較小部分的工作而設(shè)計的(“分而治之”算法)。
摘要:
- Fork / Join框架:允許更輕松的Java并行編程
- 針對多處理器系統(tǒng)(當(dāng)今幾乎所有硬件)
在以下情況下使用:
- 一批工作可以分解為較小的遞歸調(diào)用。
- 還使用工作竊取算法,其中無工作的線程可以從其他繁忙的線程中竊取可用工作
道格·李(Doug Lea)撰寫:
- oswego軟件包的創(chuàng)建者(成為java.util.concurrent)
- 實踐中Java并發(fā)的貢獻(xiàn)者
歷史簡介
Java 1.4及更低版本:開發(fā)并發(fā)類非常困難-提供的低級并發(fā)原語( synchronized , volatile , wait() , notify()和notifyAll() )難以正確使用,并且使用這些功能的錯誤難以實現(xiàn)檢測和調(diào)試
Java 5:包括新的并發(fā)實用程序包
任務(wù)計劃框架– Executor框架
執(zhí)行人:執(zhí)行已提交的對象Runnable任務(wù)。
ExecutorService:一種Executor ,提供提供產(chǎn)生Future方法,該Future表示(尚未完成)異步計算的結(jié)果。
Java 7:ForkJoinPool:一種新型的ExecutorService, which使您可以更輕松地分解要同時執(zhí)行的處理,并遞歸executes ForkJoinTasks:類似于線程的實體,其重量比普通線程輕得多。 大量的任務(wù)和子任務(wù)可能由ForkJoinPool中的少量實際線程托管。
新的ForkJoinPool采用分而治之算法。
偽代碼(摘自Doug Lea關(guān)于該主題的論文):
Result doWork(Work work) {if (work is small) {process the work}else {split up workinvoke framework to solve both parts} }摘要
- 很高興看到Java在并發(fā)空間中的持續(xù)發(fā)展以我們在Java 5中獲得的所有好處為基礎(chǔ)
- 該框架的潛在用途是有限的,并且需要一個相當(dāng)狹窄的問題范圍。
新的輸入/輸出功能
Java7引入了一個新的文件I / O庫,以增強(qiáng)平臺獨(dú)立性并增加對元數(shù)據(jù)和符號鏈接的支持。 新軟件包是java.nio.file和java.nio.file.attribute。 主要的新類是:
- 路徑 :“文件系統(tǒng)中路徑的程序表示”。 這可能是開發(fā)人員最常使用的新類(接口)。 路徑引用的文件不需要存在。 出于所有實際目的,您可以考慮用java替換java.io.File。 路徑 它包括各種可用于獲取有關(guān)路徑的信息的方法,包括創(chuàng)建,轉(zhuǎn)換和比較路徑。
- Files :Files類為文件相關(guān)的操作提供了大量的靜態(tài)方法,例如讀取,寫入和操作文件和目錄。 Files方法對Path對象的實例起作用。
而已! Java7給我們的總結(jié)。 請參閱我的下一篇博客文章,以回顧Java8中即將推出的一些功能。
翻譯自: https://www.javacodegeeks.com/2013/10/java7-a-look-back.html
總結(jié)
- 上一篇: 余额宝建信养老飞月宝冻结怎么解冻?
- 下一篇: 使用Eclipse Hibernate插