自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 7新特性:自動化資源管理

開發(fā) 后端 自動化
自動化資源管理(即ARM)能力是Java 7特有的,目前使用Java 6的朋友在編譯時很多庫都需要重新編譯以適應Java 6的需要。其目的在于當遇到錯誤或是成功執(zhí)行完代碼塊后能夠輕松處理好外部資源。

51CTO曾在《Java 7:最新特性更新、代碼示例及性能測試》中為大家介紹過Project Coin的項目。Project Coin的一個突出特點就是具備了自動化資源管理(即ARM)能力,這個能力是Java 7特有的,目前使用Java 6的朋友在編譯時很多庫都需要重新編譯以適應Java 6的需要。其目的在于當遇到錯誤或是成功執(zhí)行完代碼塊后能夠輕松處理好外部資源。其最初實現(xiàn)位于Open JDK中??紤]如下繁瑣的文件拷貝操作,代碼來自于Java Bytestream教程:

  1.  
  2.  
  3.    
  4. FileInputStream in = null;  
  5. FileOutputStream out = null;  
  6. try {  
  7.   in = new FileInputStream("xanadu.txt");  
  8.   out = new FileOutputStream("outagain.txt");  
  9.   int c;  
  10.   while ((c = in.read()) != -1)  
  11.     out.write(c);  
  12. } finally {  
  13.   if (in != null)  
  14.     in.close();  
  15.   if (out != null)  
  16.     out.close();  
  17. }  
  18.  

上面不僅有大量的樣版代碼,而且InputStream.close()的文檔表明它會拋出IOException(OutputStream也存在類似的異常,無論何種情況,要想成功編譯這些代碼,要么在外面加上catch塊,要么將異常繼續(xù)往外拋)。

try-catch-finally塊的語義范圍還要求變量FileInputStream in與FileOutputStream out聲明在塊的外面(如果定義在try塊內,那么catch塊與finally塊就訪問不到了)。

為了減少上面這些樣版代碼并且收緊塊中所用的資源范圍,Java語言在try塊中新增了一些內容。最初的try-with-resources塊(或者叫做ARM塊)規(guī)范已經(jīng)擁有實現(xiàn)了,隨后該規(guī)范被納入到JDK 7 build 105中。

新的接口java.lang.AutoCloseable被加到了提案API中,它只定義了一個會拋出Exception的方法close()。該接口是java.io.Closeable的父接口,這意味著所有的InputStream與OutputStream都會自動享受到該行為所帶來的好處。此外,F(xiàn)ileLock與ImageInputStream也實現(xiàn)了AutoCloseable接口。

這樣,上面的代碼就可以這樣來寫:

     
  1. try (  
  2.   FileInputStream in = new FileInputStream("xanadu.txt");  
  3.   FileOutputStream out = new FileOutputStream("outagain.txt")  
  4. ) {  
  5.   int c;  
  6.   while((c=in.read()) != -1 )  
  7.     out.write();  
  8. }  
  9.  

在try塊的末尾,無論是正常結束還是拋出了異常,out與in資源都會自動調用close()方法。此外,與之前示例不同的是out.close()與in.close()保證會執(zhí)行(在之前的示例中,一旦in.close()方法拋出了異常,隨后的out.close()方法就沒有機會執(zhí)行了)。

關于這種方式,還有一些微妙之處值得我們注意:

◆如上代碼所示,在資源部分中,最后一個資源后面是不允許使用分號的。

◆資源塊使用()分隔,而不是常見的{},以此將其與現(xiàn)有的try塊分隔開來。如果存在資源塊,那么里面必須要包含一個或多個資源定義語句。

◆每個資源定義具有如下形式:type var = expression;在資源塊中不能使用通常的語句。

◆資源都是隱式final的,也就是說即便沒有使用final,這些資源也都是final的。如果嘗試為資源變量賦值會得到一個編譯期錯誤。

◆資源必須是AutoCloseable的子類型,如果不是的話會得到一個編譯期錯誤。

◆資源關閉的順序與定義的順序正好相反。換句話說,在上面的代碼示例中,out.close()要先于in.close()得到調用。這么做可以構建嵌套的流,然后從外向內關閉流,這要比按順序關閉更好(也就是說,可以在底層的流關閉前先清空緩存)。

◆每個塊可以生成n+1個異常,n是資源的數(shù)量。這出現(xiàn)在代碼主體拋出了異常,然后每個資源關閉語句也都拋出異常的情況下。在這種情況下,代碼主體的異常將被拋出,但其他的異常將會被添加到異常的抑制列表(suppressed exception list)中??梢酝ㄟ^getSuppressedExceptions()方法訪問這些異常信息。

◆異常堆棧追蹤信息可以帶有Suppressed前綴:在這些情況下,序列化的Throwable格式也有所不同(如果Java 6客戶端調用了遠程Java 7運行時中的服務會出現(xiàn)這個問題,反之亦然)。

◆javax.swing與java.sql目前并不會加入到ARM中;類需要繼承AutoCloseable才能為ARM所用。JDBC 4.1如果能夠成為JDK 7的一部分,那么它也將支持ARM,但具體時間尚未確定。

能夠移除Java開發(fā)者每天都要編寫的樣版代碼對生產(chǎn)力的提升是個促進,雖然JDK 7具備了這種能力,但有時需要在編寫代碼前利用這種能力。很多庫都需要重新編譯以適應Java 6的需要,無論何時,只要使用了自動化資源管理,那么它就只能用于使用-target 7編譯的代碼。等到Java 6壽終正寢,并且Java 8發(fā)布后,使用ARM就會成為自然而然的事情了。

原文名稱:Automatic Resource Management in Java

原文作者:Alex Blewitt

原文地址:http://www.infoq.com/news/2010/08/arm-blocks

【編輯推薦】

  1. 再探Java 7:最新特性更新、代碼示例及性能測試
  2. 初探Java 7異常處理功能增強
  3. JDK 7中的函數(shù)式編程思想
  4. Java 7的第一類函數(shù):學習閉包的使用
  5. 淺談Java 7的閉包與Lambda表達式之優(yōu)劣
責任編輯:佚名 來源: infoQ譯
相關推薦

2021-07-19 09:47:37

阿里云Flink 1.12資源管理

2012-05-05 22:10:13

puppet自動化運維

2016-04-28 15:19:30

自動化云資源管理

2009-10-15 08:57:45

Windows 7電源管理

2022-04-26 12:06:10

數(shù)字孿生水務領域

2021-12-07 22:18:57

Windows 11操作系統(tǒng)微軟

2015-10-21 15:08:25

電纜自動化

2010-12-06 09:59:58

2018-09-04 15:25:57

虛擬化云計算策略

2011-08-09 16:12:39

Windows7資源管理器

2010-01-08 08:54:41

Windows 7資源管理器

2017-12-17 21:58:18

2021-01-05 11:13:00

資源管理前程無憂

2021-12-27 11:26:32

Windows 11操作系統(tǒng)微軟

2021-11-22 16:21:28

Kubernetes 運維開源

2009-06-24 14:18:47

資源管理敏捷項目

2013-12-21 19:58:32

SDN應用資源管理平臺SDN

2023-12-15 15:14:10

yarn任務管理資源管理

2011-02-28 13:36:31

自動化管理VMControl

2011-03-24 09:22:36

Java 7JDBC4
點贊
收藏

51CTO技術棧公眾號