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()方法也是可以正常執行呼叫的