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

《Effective Java》學習筆記(三):類與介面設計精要

     編輯:Java 相關知識

前言

本文為《Effective Java》讀書筆記第三部分,聚焦第 4 章「類和介面」,涵蓋存取權限、不可變類、組合優於繼承、介面設計等核心準則,對提升 Java 程式碼品質與可維護性具有指導意義。

第 12 條:使類和成員的可訪問性最小化

資訊隱藏是模組化設計基石。嚴格限制存取層級(private > package-private > protected > public)可降低耦合。特別警惕 公有靜態 final 陣列/集合:雖引用不可變,但內容可被外部修改,屬安全隱患。解決方案:改為 private 並提供不可變視圖或防禦性複製。

第 13 條:偏向不可變類

不可變類(如 String, Integer)優點顯著:

  • 簡單性:僅有一種狀態,構造後即不變。
  • 線程安全:天生免疫競態條件,無需同步。
  • 自由共用:可緩存實例、作為 Map 鍵/Set 元素。
  • 構建基石:適合作為其他物件的組件。

五大實作準則:

  1. 不提供修改狀態的方法(setter、修改內部可變物件的方法)。
  2. 確保類不可被繼承(final 類或私有構造器+靜態工廠)。
  3. 所有欄位宣告為 final。
  4. 所有欄位宣告為 private。
  5. 對可變組件進行防禦性複製(輸入/輸出時)。

缺點: 每個不同值需個別實例,可能造成效能壓力。對策:提供可變伴隨類(如 StringBuilder)或靜態工廠緩存常用實例。

第 14 條:組合優於繼承

繼承破壞封裝:子類依賴父類實現細節,父類變更易導致子類失效。僅在「is-a」關係(子型別)成立時使用繼承,且必須遵守里氏替換原則。其他情況(如代碼復用、擴展功能)應採用組合:新類包含現有類實例,轉發方法調用。此即「裝飾者模式」雛形。

第 15 條:要么為繼承而設計並文檔化,要么禁止繼承

若允許繼承,必須:

  • 文檔化自用模式:哪些可覆寫方法會被內部調用(構造器、clone、readResolve 中不得調用可覆寫方法)。
  • 測試子類驗證設計。

最佳實踐:預設 final 類,除非有明確繼承需求。

第 16 條:介面優於抽象類

介面定義類型契約,支援多實現、多介面實現、骨架實現類(AbstractXxx)模式。抽象類適合演化穩定的類型層級(新增方法不破壞現有子類)。公開介面設計需極度謹慎,發布後盡量不變更。

第 17 條:介面僅用於定義類型

介面中定義常量(public static final int X = 1)屬濫用,會洩露實現細節並污染命名空間。替代方案:不可實例化的工具類(私有構造器)或 enum 類型。

第 18 條:靜態成員類優於非靜態成員類

非靜態內部類隱含持有外部實例引用,增加記憶體負擔且易造成記憶體洩漏。除非需要存取外部實例成員,否則宣告為 static。

總結

良好的類/介面設計核心在於:封裝變化、最小化可變狀態、偏向組合、介面定義契約。貫徹這些原則,能編寫出健壯、靈活、易維護的 Java 代碼。

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