Java程式設計中資源物件管理的進化
Java程式設計中資源物件管理的進化
- 2018.8.8
- 版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。
使用Java開發業務時,常常需要處理資源,這是很常見的需求。
Java 7以前
在Java 7以前,處理(關閉)資源是這樣的:
public static int getAccountStatusCodeFromDataStore_traditional(String accountId) throws SQLException {
String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
Statement statement = null;
ResultSet resultSet = null;
try {
statement = createStatementFromConnection();
resultSet = statement.executeQuery(accountStatusCodeQuery);
return getAccountStatusCodeFromResultSet(resultSet);
} finally {
if (resultSet != null)
resultSet.close();
if (statement != null)
statement.close();
}
}
開發人員必須關閉建立的所有資源,否則會導致資源洩漏。
Java 7/8
而在Java 7中,引入了try-with-resources的新方法,可以在try-catch塊中使用的正確順序自動處理資源的關閉,比如:
public static int getAccountStatusCodeFromDataStore_java7(String accountId) throws SQLException {
String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
try (Statement statement = createStatementFromConnection();
ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery)) {
return getAccountStatusCodeFromResultSet(resultSet);
}
}
在此示例中,可以看到程式碼更簡潔了,整體可讀性提高了,它實現了資源的自動管理。我們可以在try-with-resources語句中擁有多個資源,且多個資源的宣告之間應該用分號分隔。當這些資源在自動關閉時,也會保持宣告的反向邏輯順序依次關閉(最後宣告的資源將首先關閉)。
如果這裡要丟擲異常,try塊的異常會會壓制try-with-resources塊的異常。如果確實有需要,可以通過從try塊丟擲的異常中呼叫Throwable.getSuppressed方法來檢索被try塊抑制的異常。
另外,try-with-resources語句也可以有catch和finally塊。在宣告的資源被關閉後會執行任何catch或finally塊。
Java 9
而到了Java 9時代,對於try-with-resources的資源處理,Java 9中引入了更簡潔的版本。如果開發者已經將資源宣告為final或effective final型別,那麼可以在try-with-resources中直接使用它們而無需建立任何新變數。這使得我們可以進一步利用自動資源管理。上面的程式碼現在可使用更簡潔的try-with-resources實現,如下:
public static int getAccountStatusCodeFromDataStore_java9(String accountId) throws SQLException {
String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
// 明確宣告final
final Statement statement = createStatementFromConnection();
// effective final
ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery);
try (statement; resultSet) {
return getAccountStatusCodeFromResultSet(resultSet);
}
}
可見,程式碼的易讀性提高了。
其實大多數的資源類在背後實現了AutoCloseable或Closeable介面,因此與try-with-resources語句協同工作才實現了自動資源管理。如果我們處理的資源沒有實現AutoCloseable或Closeable介面,那麼就必須遵循傳統的方法來關閉資源。
相關文章
- 好程式設計師Java學習路線之Java中的物件流和序列化程式設計師Java物件
- java面對物件程式設計的概念Java物件程式設計
- 使用反應式程式設計替換Java自動資源管理 - Arvind程式設計Java
- Java中物件導向的設計原則Java物件
- Java程式設計__Chap3 面對物件__程式設計題Java程式設計物件
- 細談unity資源管理的設計Unity
- java-物件導向程式設計--(3)Java物件程式設計
- 《JAVA併發程式設計實戰》物件的組合Java程式設計物件
- 遊戲機制設計:資源管理挑戰與遊戲中的AI設計遊戲AI
- 物件導向程式設計-java語言 第二週程式設計題物件程式設計Java
- 《Java程式設計思想》筆記08——持有物件Java程式設計筆記物件
- Java語言程式設計——物件和類09Java程式設計物件
- java-物件導向程式設計--多型Java物件程式設計多型
- java-物件導向程式設計--繼承Java物件程式設計繼承
- JAVA_15 物件導向程式設計(下)Java物件程式設計
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- Swift 中的面向協議程式設計:是否優於物件導向程式設計?Swift協議程式設計物件
- Java——物件導向程式設計的一些總結Java物件程式設計
- Java中的面向切面程式設計(AOP)Java程式設計
- 好程式設計師大資料學習資料之YARN資源管理程式設計師大資料Yarn
- 【JAVA程式設計】實驗三 函式與物件Java程式設計函式物件
- 10 Python物件導向程式設計:類和物件以及和Java的對比Python物件程式設計Java
- Java併發程式設計中的設計模式解析(一)Java程式設計設計模式
- 快速使用 vscode 進行 Java 程式設計VSCodeJava程式設計
- 理解Js中物件導向程式設計的繼承JS物件程式設計繼承
- JavaScript物件程式設計JavaScript物件程式設計
- 好程式設計師Java教程分享Nginx靜態資源部署程式設計師JavaNginx
- 好程式設計師Java學習資源分享RabbitMQ介紹程式設計師JavaMQ
- 好程式設計師Java教程分享Java物件導向與程式導向程式設計師Java物件
- Rust 程式設計影片教程(進階)——020_1 物件Rust程式設計物件
- Java 中的資料流和函數語言程式設計Java函數程式設計
- 非同步程式設計方案進化論非同步程式設計
- 【譯】Java8官方教程:物件導向程式設計的概念Java物件程式設計
- Java程式設計基礎13——常見物件_String類Java程式設計物件
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 程式設計體系結構(06):Java物件導向程式設計Java物件
- 遊戲中“血條”設計的進化史遊戲
- javascript:物件導向的程式設計JavaScript物件程式設計