首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Effective Java 經驗總結:創建和銷毀對象

     編輯:Java 綜合教學

Effective Java 經驗總結:創建和銷毀對象

本文摘錄自《Effective Java》中關於「創建和銷毀對象」章節的核心條目,旨在幫助開發者掌握物件生命周期管理的最佳實踐。

條目 1:考慮用靜態工廠方法代替構造器

  • 優點:有名稱、可控制實例創建(單例、不可變類)、可返回子類型、參數化類型構建更簡潔。
  • 缺點:無 public/protected 構造器無法子類化;難以與其他靜態方法區分。
  • 常見命名:from, of, valueOf, instance, getInstance, newInstance, getType, newType。

條目 2:遇到多個構造器參數時要考慮用構建器

  • 適用於參數超過 4 個、或有許多可選參數的場景。
  • Builder 模式支持鏈式調用、參數驗證、不可變對象構建。
  • 示例:NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).build();

條目 3:用私有構造器或枚舉類型強化 Singleton 屬性

  • 枚舉實現單例最簡潔、線程安全、防序列化破壞、防反射攻擊。
  • 傳統雙重檢查鎖定(DCL)在 Java 5+ 中需加 volatile 保證可見性。

條目 4:通過私有構造器強化不可實例化的能力

  • 工具類(如 Collections, Arrays)應拋出 AssertionError 防止意外實例化。

條目 5:優先考慮依賴注入來引用資源

  • 避免硬編碼資源創建(如 new DatabaseConnection()),改由容器或工廠注入,提高靈活性與可測試性。

條目 6:避免創建不必要的對象

  • 重用不可變對象(如 String, Boolean.valueOf())。
  • 使用基本類型代替裝箱類型;警惕自動裝箱產生的臨時對象。
  • 對象池適用於創建代價極高的對象(如數據庫連接、線程),一般情況下現代 GC 已足夠高效。

條目 7:消除過期的對象引用

  • 內存洩漏常見於:集合類未清理、監聽器未註銷、緩存未失效、回調未移除。
  • 手動將引用置 null 屬於「治標不治本」,應從設計上確保引用生命周期正確終結。

條目 8:避免使用終結方法和清理器

  • finalize() 不可靠、性能差、無執行順序保證;Java 9 標記為 Deprecated。
  • 資源釋放應使用 try-with-resources 或實現 AutoCloseable,配合 Cleaner(Java 9+)作為最後防線。

實戰建議

  1. 預不可變對象,減少防禦性拷貝與同步開銷。
  2. 構造器/工廠方法中驗證參數,失敗快速(Fail Fast)。
  3. 實現 AutoCloseable 並配合 try-with-resources 管理資源。
  4. 使用 WeakReference/SoftReference 實現緩存,避免強引用阻礙 GC。

掌握這些條目,能顯著提升代碼的健壯性、可維護性與性能表現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved