Effective Java
Ch2
item2
- Telescoping constructor pattern : does not scale well
- JavaBeans Pattern : allows inconsistency, mandates mutability
- Builder (Recommend)
- Hierarchical Builder (Subclass)
item3
- Singleton with public final field
- Singleton with static factory
- Enum Singleton (The preferred approach)
item4
- Noninstantiable Utility Class : 禁止通過默認構造函數實例化
item6
p.22 - p.23
效能問題的根源
isRomanNumeralSlow()方法每次調用時都會創建一個新的 Pattern 對象String.matches()方法內部也會重複創建 Pattern 對象Pattern對象的編譯成本較高,重複創建會影響效能
性能差異
- Slow 版本:每次檢查羅馬數字時都要重新編譯正則表達式
- Fast 版本:只在類加載時編譯一次正則表達式,後續重複使用
實際應用建議 :
- 對於經常使用的正則表達式,應該將 Pattern 定義為靜態常量,類似的情況還包括 : 資料庫連接、線程池、緩存等重量級對象
p.24
- 自動裝箱
(Autoboxing)帶來的性能問題
item7
自定義異常處理
- Spring :
@RestControllerAdvice - Result Pattern
記憶體洩漏(Memory Leak)
- 原始的 pop() 方法存在記憶體洩漏,當元素被移除時,陣列中的引用仍然存在
- 雖然 size 減少了,但被
pop()的對象仍然被陣列引用著,這些廢棄的引用會阻止垃圾回收機制(GC)回收這些對象
item8
- 清理器(Cleaner)和資源管理
- 避免使用
finalizers和cleaners - 只有在處理非 JVM 管理的資源,且需要額外安全保障時才考慮使用
- 原生內存(Native Memory)操作
- 操作系統資源
- 檔案描述符(File Descriptors)
- Network Sockets
- 系統臨時檔案
- 共享內存區域
- 與外部系統的連接:
- Native Libraries 載入
- 硬體設備連接
- IPC(進程間通信)資源
- JNI
- 圖形處理資源
- 避免使用
item9
- Using
try-with-resource(recommend)