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