java7 try-with-resources 很香

Java 7爲懶惰的Java開發人員帶來了一些非常好的功能。嘗試資源是這種功能之一,它可以減少代碼行,並使代碼更健壯。在本教程中,我將討論有關此功能的內容。

1.資源清除的舊方法(在Java 7之前)

**我們長期以來一直在這樣做。例如,從文件系統讀取文件。代碼可能看起來有所不同,但流程如下例所示:

public class ResourceManagementBeforeJava7 
{
    public static void main(String[] args) 
    {
        BufferedReader br = null;
        try
        {
            String sCurrentLine;
            br = new BufferedReader(new FileReader("C:/temp/test.txt"));
            while ((sCurrentLine = br.readLine()) != null) 
            {
                System.out.println(sCurrentLine);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (br != null)
                    br.close();
            } 
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

這些類型的代碼在具有大量IO操作的應用程序代碼庫中非常常見。
try和catch塊中的代碼本質上很重要,並且具有一些特定於應用程序的邏輯。但是,終於封鎖了嗎?在大多數情況下,finall塊只是被複制粘貼,目的是通過關閉它們來避免損壞資源。
當您有3-4個這樣的資源要在單個finally塊中關閉時,這些final塊看起來更難看。當我們知道時,您是否不認爲這些final塊不必要地存在,我們必須以任何方式關閉資源而沒有任何例外情況?
Java 7通過try-with-resources功能解決了這個問題。#

2.使用try-with-resources的新方法(語法示例)

現在看看在Java 7中打開和關閉資源的新方法。

public class ResourceManagementInJava7 
{
    public static void main(String[] args) 
    {
        try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt")))
        {
            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) 
            {
                System.out.println(sCurrentLine);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

有兩件事需要密切注意:

  1. 文件資源(BufferedReader)以特殊方式在try塊中打開(在小括號內)。
  2. finally塊完全消失了。

最後但並非最不重要的一點是,代碼看起來很漂亮且易於閱讀。很好,對嗎?但是它實際上是如何工作的?

3.實際如何運作?

在Java 7中,我們有一個新的超級接口java.lang.AutoCloseable**。該接口有一種方法:

void close() throws Exception;

Java文檔建議此接口在不再需要時必須關閉的任何資源實現
當我們在特殊的try-with-resource塊中打開任何此類AutoCloseable資源時,在try塊完成後,JVM會對在“ try()”塊中初始化的所有資源立即調用close()方法
例如,BufferedReader已實現close()方法文件如下:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        in.close();
        in = null;
        cb = null;
    }
}

由於上述方法定義,當JVM調用此方法時,所有基礎流或IO資源都將關閉。

4.向自定義資源添加功能

好吧,這是一個很好的資源清理設計。但是它僅適用於JDK本機類嗎?沒有。您也可以將其用於自定義資源。
例如,我在以下代碼中創建了一個自定義資源:

public class CustomResource implements AutoCloseable 
{
    public void accessResource() {
        System.out.println("Accessing the resource");
    }
     
    @Override
    public void close() throws Exception {
        System.out.println("CustomResource closed automatically");
    }
}

現在,我將在示例代碼中使用它:

public class TryWithCustomResource 
{
    public static void main(String[] args)
    {
        try(CustomResource cr = new CustomResource())
        {
            cr.accessResource();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
 
Putput in console:
 
Accessing the resource
CustomResource closed automatically

控制檯中的輸出清楚地證明,try塊完成後,資源將自動關閉。

5.總結

這就是Java 7中使用try-with-resources進行自動資源管理的全部內容。讓我們逐點記下重點內容:

  • 在Java 7之前,我們必須使用finally塊來清理資源。最後,塊不是強制性的,但是清理資源是爲了防止系統損壞。
  • 使用Java 7,無需顯式的資源清理。它是自動完成的。
  • 在try-with-resources塊(try(…){…})中初始化資源時完成自動資源清理。
  • 由於發生了新界面AutoCloseable,因此發生了清理。try塊完成後,JVM將立即調用其close方法。
  • 如果要在自定義資源中使用此功能,則必須實現AutoCloseable接口。否則程序將無法編譯。
  • 您不應在代碼中調用close()方法。JVM應該自動將其稱爲。手動調用它可能會導致意外結果。

學習愉快!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章