Effective Java學(xué)習(xí)筆記1

組合還是繼承

假設(shè)我們要統(tǒng)計set的歷史元素數(shù)。

1. 定義一個類,申明一個靜態(tài)成員變量作為計數(shù)器,嘗試重寫add和addAll方法,計數(shù)器增加。

發(fā)現(xiàn)數(shù)量統(tǒng)計是預(yù)期的2倍,因為addAll里面調(diào)用了add,被兩次計數(shù)。

如果之重寫add,假如addAll以后的發(fā)布版本中不調(diào)用了add了怎么辦。如果把addAll全部重寫,那么父類的實現(xiàn)被架空。假如為了保證安全,父類在元素加入之前做檢查,我們架空的方法就很危險。

2. 如果父類新增了一個方法,簽名和你子類中的一個方法一樣,但是返回值不一樣,傻眼了,編譯通不過。

3. 咋整,用組合模式

新建前置類實現(xiàn)set接口,同時定義一個set的成員變量,繼承方法實現(xiàn)調(diào)用成員變量的方法。

創(chuàng)建工具類 再擴展前置類,實現(xiàn)計數(shù)。就是裝飾器模式。

這種玩法和委托有所區(qū)別,在于包裝的東西和自己有沒有關(guān)系

還有在回調(diào)場景下,不適合。


4.適合用組合卻用了繼承,比如Properties繼承了HashTable,Stack繼承了Vector。

Properties對象實例p 可以調(diào)用父類的getKey()得到一個很粗糙的值,而且Properties設(shè)計的時候只支持String,但是p調(diào)用父類的put,隨便什么都可以放進去,很亂套。

所以只有 在確定A肯定是B的時候,A再去繼承B。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,184評論 0 3
  • 《Effective Java》筆記(上) 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造...
    OCNYang閱讀 2,786評論 2 17
  • 一、基礎(chǔ)知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,563評論 0 4
  • ch1 10章,78點,每個點都有正反兩面的例子。 基于Java 5。 各個點之間相互獨立,有部分互相引用。 看英...
    冰紅茶蓋閱讀 163評論 0 0
  • 上個禮拜基本上又是和身體在對抗中度過了,所以也沒有做成什么事情,快到三十歲了,身體卻越發(fā)的比不上少年了,十幾年沒有...
    陳總閱讀 308評論 0 1

友情鏈接更多精彩內(nèi)容