本文為《Effective Java》讀書筆記第三部分,聚焦第 4 章「類和介面」,涵蓋存取權限、不可變類、組合優於繼承、介面設計等核心準則,對提升 Java 程式碼品質與可維護性具有指導意義。
資訊隱藏是模組化設計基石。嚴格限制存取層級(private > package-private > protected > public)可降低耦合。特別警惕 公有靜態 final 陣列/集合:雖引用不可變,但內容可被外部修改,屬安全隱患。解決方案:改為 private 並提供不可變視圖或防禦性複製。
不可變類(如 String, Integer)優點顯著:
五大實作準則:
setter、修改內部可變物件的方法)。final 類或私有構造器+靜態工廠)。final。private。缺點: 每個不同值需個別實例,可能造成效能壓力。對策:提供可變伴隨類(如 StringBuilder)或靜態工廠緩存常用實例。
繼承破壞封裝:子類依賴父類實現細節,父類變更易導致子類失效。僅在「is-a」關係(子型別)成立時使用繼承,且必須遵守里氏替換原則。其他情況(如代碼復用、擴展功能)應採用組合:新類包含現有類實例,轉發方法調用。此即「裝飾者模式」雛形。
若允許繼承,必須:
clone、readResolve 中不得調用可覆寫方法)。最佳實踐:預設 final 類,除非有明確繼承需求。
介面定義類型契約,支援多實現、多介面實現、骨架實現類(AbstractXxx)模式。抽象類適合演化穩定的類型層級(新增方法不破壞現有子類)。公開介面設計需極度謹慎,發布後盡量不變更。
介面中定義常量(public static final int X = 1)屬濫用,會洩露實現細節並污染命名空間。替代方案:不可實例化的工具類(私有構造器)或 enum 類型。
非靜態內部類隱含持有外部實例引用,增加記憶體負擔且易造成記憶體洩漏。除非需要存取外部實例成員,否則宣告為 static。
良好的類/介面設計核心在於:封裝變化、最小化可變狀態、偏向組合、介面定義契約。貫徹這些原則,能編寫出健壯、靈活、易維護的 Java 代碼。