JAVA常用類--AutoCloseable介面

月亮警察發表於2024-03-11

AutoCloseable介面

自動關閉,釋放資源機制

在實際的專案開發過程中,一般都有可能連線到一些資源,比如:檔案資源、網路資源、資料庫資源,在實際專案之中進行資源訪問的社會一般有如下幾個操作步驟:

不使用AutoCLoseable:

手動定義關閉函式

按照正常的結構設計來講,當前的程式已經可以滿足整個設計上的開發要求,因為有正常的連線同時又可以進行伺服器斷開訪問

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
//介面
interface IMessage{
     public void send(String msg);//傳送訊息的核心功能
}
//實現介面的類
class NetMassage implements IMessage{
    //無參構造
    //當前的設計為:只要例項化了此類物件就表示要進行訊息的傳送。則就需要連線網路伺服器
    public NetMassage() {
        System.out.println("【連線】連線遠端伺服器,建立訊息的服務通道....");
    }
    @Override
    public void send(String msg) {
        System.out.println("【傳送】"+ msg);//模擬資料的傳送
    }
    //關閉/釋放資源
    public void close(){
        System.out.println("【關閉】網路訊息傳送完畢,斷開服務聯結器...");
    }
}
public class Application {
    public static void main(String[] args) {
        //例項化
        NetMassage massage = new NetMassage();//建立訊息傳送類
        massage.send("傳送訊息啦!!");
        massage.close();//釋放資源
    }
}

執行結果如下:

【連線】連線遠端伺服器,建立訊息的服務通道....
【傳送】傳送訊息啦!!
【關閉】網路訊息傳送完畢,斷開服務聯結器...

雖然以上程式碼已經可以正常實現網路訊息的處理模型,但當前的程式本身又存在以下幾個問題:

  • 按照正常的設計開發的結構來講,此時的程式應該是面向介面的開發,應該在介面裡面提供所有的核心業務功能
  • 如果此時透過子類獲取IMessage介面物件,會發現無法正常的進行close()方法的呼叫
  • 既然所有的資源在操作完畢之後都需要關閉,那麼就可以有一種自動關閉的機制-----AutoCloseable
  • 注意:JDK1.7以上有AutoCloseable

使用AutoCloseable:

必須和異常處理語句一起使用!!!!

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

//介面 繼承AutoCloseable類(實現自動關閉)
// AutoCloseable類要和異常捕獲一起使用!!!
interface IMessage extends AutoCloseable{
     public void send(String msg);//傳送訊息的核心功能
}
//實現介面的類
class NetMassage implements IMessage{
    //無參構造
    //當前的設計為:只要例項化了此類物件就表示要進行訊息的傳送。則就需要連線網路伺服器
    public NetMassage() {
        System.out.println("【連線】連線遠端伺服器,建立訊息的服務通道....");
    }
    @Override
    public void send(String msg) {
        System.out.println("【傳送】"+ msg);//模擬資料的傳送
    }
    //關閉/釋放資源
    public void close(){
        System.out.println("【關閉】網路訊息傳送完畢,斷開服務聯結器...");
    }
}
public class Application {
    public static void main(String[] args) {
        //AutoCloseable類要和異常處理語句一起使用!!!
        try ( NetMassage massage = new NetMassage();){
            massage.send("傳送訊息啦!!");
        } catch (Exception e) {
        }
        //massage.close();//釋放資源
    }
}

執行結果如下:

【連線】連線遠端伺服器,建立訊息的服務通道....
【傳送】傳送訊息啦!!
【關閉】網路訊息傳送完畢,斷開服務聯結器...

在執行過程中有異常丟擲也可以自動關閉: send函式修改如下

@Override
    public void send(String msg) {
        if(msg.contains("傳送訊息")){ //手動丟擲異常
            throw new RuntimeException("異常丟擲!!");
        }
        System.out.println("【傳送】"+ msg);//模擬資料的傳送
    }

執行結果如下:

【連線】連線遠端伺服器,建立訊息的服務通道....
【關閉】網路訊息傳送完畢,斷開服務聯結器...

透過以上的程式碼可以發現,必須結合異常處理語句之後才可以使用自動關閉的處理機制,如果在呼叫的過程之中出現有異常close()方法也是可以正常執行呼叫的

相關文章