Effective Java 讀書筆記(2)
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.
總結:
- 在 Public 的類中不應該暴露任何可變的域.
- 對於不可變的域, 比如帶 final 的基本型別的域可以考慮暴露, 但是最好不要.
- 對於包可見或者私有的類可以考慮直接暴露.
寫 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
總結:
- 為了最大化 API 的靈活性. 在代表生產者或者消費者的輸入引數中使用萬用字元型別. 要熟練使用 PECS 法則.
- 不要在返回值中使用萬用字元型別.
- 如果讓類的使用者去思考關於萬用字元型別的問題, 那麼 API 的設計裡一定有一些錯誤.
- 如何型別引數, 只出現在方法宣告中, 使用萬用字元型別來替代.
這一章中大概時本書中最有價值的一章. PECS 原則可以讓自己少走很多彎路.
相關文章
- 《Effective Java 第二版》讀書筆記Java筆記
- 《Effective C++》讀書筆記C++筆記
- 《Effective-Ruby》讀書筆記筆記
- 讀書筆記2筆記
- 《Effective Objective-C 2.0》讀書/實戰筆記 一Object筆記
- 《Effective DevOps》閱讀筆記 82dev筆記
- 《Effective DevOps》閱讀筆記 59dev筆記
- 《Effective DevOps》閱讀筆記 19dev筆記
- [讀書筆記][effective C++]條款30-inline的原理筆記C++inline
- 讀書筆記(2)《微精通》筆記
- 《Head First Java》20201017讀書筆記Java筆記
- 《Head First Java》20200927讀書筆記Java筆記
- 《Head First Java》20201009讀書筆記Java筆記
- 《HTTP/2 基礎教程》 讀書筆記HTTP筆記
- 讀書筆記筆記
- 《讀書與做人》讀書筆記筆記
- 程式碼整潔之道--讀書筆記(2)筆記
- 《程式碼大全2》讀書筆記2(5-6)筆記
- 《Java程式設計思想》讀書筆記一Java程式設計筆記
- 讀書筆記-Java程式設計思想-03筆記Java程式設計
- 讀書筆記2-記憶體優化篇筆記記憶體優化
- Effective C++筆記C++筆記
- JVM讀書筆記之java記憶體結構JVM筆記Java記憶體
- webpackDemo讀書筆記Web筆記
- Vue讀書筆記Vue筆記
- 散文讀書筆記筆記
- Cucumber讀書筆記筆記
- HTTP 讀書筆記HTTP筆記
- postgres 讀書筆記筆記
- 讀書筆記3筆記
- java併發變成實戰讀書筆記(1,2章節)Java筆記
- Effective Objective-C 2.0讀書筆記(一)-如何減少標頭檔案的引入Object筆記
- fluent python 讀書筆記 2–Python的序列型別2Python筆記型別
- 《深入核心的敏捷開發》讀書筆記(2)敏捷筆記
- 《Haskell趣學指南》讀書筆記(2):Type And TypeclassHaskell筆記
- Effective Python學習筆記Python筆記
- effective C++筆記1C++筆記
- js高程讀書筆記JS筆記
- 《論語》讀書筆記筆記