Effective Java 讀書筆記(2)

weixin_34279579發表於2017-06-07

Chapter 4 Class And Interface

類和介面是 Java 語言中最核心的抽象概念. 這章裡的建議不是教你如何設計一個類 (這個是設計模式的內容), 而是給出一些通用的建議。

Item 13 Minimize the accessibility of classes and members

最小化類的可見度. 一個設計良好的模組應該儘量隱藏內部實現的細節, 介面和實現分離. 所以應該類和方法應該儘量降低自己的可見性. 特別是屬性, 即使是 final 的屬性也不應該是 public, 應該提供 getter 和 setter. 唯一的例外就是 static final 的屬性.

這一條的原則是沒有錯的, 不過 Java 提供的三種可見性裡並沒有模組可見. 而更多的時候其實我們需要的是 module 內部的可見域. Kotlin 就提供了 internal 可見性, 只有 module 內部可見.

BTW: Java 一直想把模組化的方式標準化. OSGi 也使用了很多年, 不過 Oracle 更喜歡自己提出的 Jigsaw. 所以一直沒有共識, 從 Java 7, Java 8 拖到現在的即將要出的 Java 9. Jigsaw 在最新的投票又被投了反對票. 所以 Java 9 到底能不能加入這功能還是一個未知數. Java 9 釋出後, 帶上了 Jigsaw.

Item 14 In Public classes, use accessor methods, not public fields.

總結:

  1. 在 Public 的類中不應該暴露任何可變的域.
  2. 對於不可變的域, 比如帶 final 的基本型別的域可以考慮暴露, 但是最好不要.
  3. 對於包可見或者私有的類可以考慮直接暴露.

寫 getter 和 setter 實在不是美好的體驗, 雖然可以用 IDE 生成, 但是確實會很繁瑣. 這裡就不得不提一下 Kotlin 的 Property 實在是相當方便啊, Java 在語法糖上還是要加把勁啊.

Chapter 5 Generics

Java 的一個很重要的優點就是語法簡單. 泛型可能是 Java 裡唯一一個比較複雜的語法. 使用起來確實有很多需要注意的地方.

Item 25 Don't use raw types in new code

這個大家應該已經習慣.

Item 28 Use bounded wildcards to increase API flexibility

總結:

  1. 為了最大化 API 的靈活性. 在代表生產者或者消費者的輸入引數中使用萬用字元型別. 要熟練使用 PECS 法則.
  2. 不要在返回值中使用萬用字元型別.
  3. 如果讓類的使用者去思考關於萬用字元型別的問題, 那麼 API 的設計裡一定有一些錯誤.
  4. 如何型別引數, 只出現在方法宣告中, 使用萬用字元型別來替代.

這一章中大概時本書中最有價值的一章. PECS 原則可以讓自己少走很多彎路.

相關文章