Chapter 4 Class And Interface
類和接口是 Java 語言中最核心的抽象概念. 這章里的建議不是教你如何設(shè)計一個類 (這個是設(shè)計模式的內(nèi)容), 而是給出一些通用的建議。
Item 13 Minimize the accessibility of classes and members
最小化類的可見度. 一個設(shè)計良好的模塊應(yīng)該盡量隱藏內(nèi)部實現(xiàn)的細(xì)節(jié), 接口和實現(xiàn)分離. 所以應(yīng)該類和方法應(yīng)該盡量降低自己的可見性. 特別是屬性, 即使是 final 的屬性也不應(yīng)該是 public, 應(yīng)該提供 getter 和 setter. 唯一的例外就是 static final 的屬性.
這一條的原則是沒有錯的, 不過 Java 提供的三種可見性里并沒有模塊可見. 而更多的時候其實我們需要的是 module 內(nèi)部的可見域. Kotlin 就提供了 internal 可見性, 只有 module 內(nèi)部可見.
BTW: Java 一直想把模塊化的方式標(biāo)準(zhǔn)化. OSGi 也使用了很多年, 不過 Oracle 更喜歡自己提出的 Jigsaw. 所以一直沒有共識, 從 Java 7, Java 8 拖到現(xiàn)在的即將要出的 Java 9. Jigsaw 在最新的投票又被投了反對票. 所以 Java 9 到底能不能加入這功能還是一個未知數(shù). Java 9 發(fā)布后, 帶上了 Jigsaw.
Item 14 In Public classes, use accessor methods, not public fields.
總結(jié):
- 在 Public 的類中不應(yīng)該暴露任何可變的域.
- 對于不可變的域, 比如帶 final 的基本類型的域可以考慮暴露, 但是最好不要.
- 對于包可見或者私有的類可以考慮直接暴露.
寫 getter 和 setter 實在不是美好的體驗, 雖然可以用 IDE 生成, 但是確實會很繁瑣. 這里就不得不提一下 Kotlin 的 Property 實在是相當(dāng)方便啊, Java 在語法糖上還是要加把勁啊.
Chapter 5 Generics
Java 的一個很重要的優(yōu)點就是語法簡單. 泛型可能是 Java 里唯一一個比較復(fù)雜的語法. 使用起來確實有很多需要注意的地方.
Item 25 Don't use raw types in new code
這個大家應(yīng)該已經(jīng)習(xí)慣.
Item 28 Use bounded wildcards to increase API flexibility
總結(jié):
- 為了最大化 API 的靈活性. 在代表生產(chǎn)者或者消費者的輸入?yún)?shù)中使用通配符類型. 要熟練使用 PECS 法則.
- 不要在返回值中使用通配符類型.
- 如果讓類的使用者去思考關(guān)于通配符類型的問題, 那么 API 的設(shè)計里一定有一些錯誤.
- 如何類型參數(shù), 只出現(xiàn)在方法聲明中, 使用通配符類型來替代.
這一章中大概時本書中最有價值的一章. PECS 原則可以讓自己少走很多彎路.