整理 Effective Java 書中 Item 20: Prefer interfaces to abstract classes 心得筆記
主旨
Java 提供兩種方式定義「可以有多個實作」的類型:介面(interface)和抽象類別(abstract class)。在 Java 8 引入 default methods 之後,兩者都能提供方法實作。但總體來說,介面更靈活、延伸性更好,也比較不會限制使用者的設計。本章重點就是告訴你:大多數情況下,請選擇介面。
整理 Effective Java 書中 Item 20: Prefer interfaces to abstract classes 心得筆記
Java 提供兩種方式定義「可以有多個實作」的類型:介面(interface)和抽象類別(abstract class)。在 Java 8 引入 default methods 之後,兩者都能提供方法實作。但總體來說,介面更靈活、延伸性更好,也比較不會限制使用者的設計。本章重點就是告訴你:大多數情況下,請選擇介面。
整理 Effective Java 書中 Item 19: Design and document for inheritance or else prohibit it 心得筆記
Java 裡的繼承功能很強,但使用起來也很危險。如果你打算讓別人「繼承你的類別」,你不只是要寫出可以用的 API,還要公開類別的內部行為細節。如果沒做到這一點,繼承後的子類可能會在某次更新中爆掉。
所以這一條的建議是:
如果你沒打算讓別人繼承,就該禁止繼承;
如果你開放繼承,就要設計與文件都做到位。
整理 Effective Java 書中 Item 18: Favor composition over inheritance 心得筆記
繼承常被拿來重用程式碼,但其實風險也很高,尤其當你繼承的類別不是為了擴充而設計。這篇重點是:「與其繼承一個現成的類別,不如把它包進一個欄位(組合)來用」,這樣可以避開繼承帶來的封裝破壞與潛在 bug,讓設計更穩健。
整理 Effective Java 書中 Item 17: Minimize mutability 心得筆記
當你設計類別時,預設應該先問自己:這個物件真的需要改變狀態嗎?如果不需要,請讓它不可變(Immutable)。不可變類別更安全、更好測試、也更容易被重用與快取。
整理 Effective Java 書中 Item 16: In public classes, use accessor methods, not public fields 心得筆記
公開類別若直接暴露成員欄位(如 public int x
),將會失去封裝帶來的所有好處:無法控制欄位存取、難以變更內部結構、也無法強制不變條件。正確做法是:使用私有欄位,並搭配 public 的 getter / setter 方法進行存取。