effective java 介面優於抽象類

2021-09-24 09:06:47 字數 1796 閱讀 5953

1,已有的類更容易實現新介面,而實現新的抽象類十分困難

假如,你需要讓已有的類class n擁有乙個全新的型別,以便其作為元件用在某程式中,你有兩個選擇。

2,介面可以輕易實現混合型別,抽象類辦不到

此優勢和第一條本質一樣,現有的類擁有新的型別,新的身份,也就是打造混合型別,

比如:你有一杯豆漿,現在有乙個奶介面, 乙個糖介面,你想獲得一杯加奶加糖豆漿,很簡單,你同時實現奶介面,糖介面就行。

你還有哦一別豆漿,現在有乙個奶抽象類,乙個糖抽象類,你還是想要一杯加奶加糖豆漿,你怎麼做,你發現,繼承了奶抽象類,就不能繼承糖抽象類了。怎麼辦呢?有乙個辦法,你新建乙個抽象類奶糖抽象類,你只需要繼承這個奶糖抽象類就可以,好像也挺簡單的,但是,你要是再想加點咖啡怎麼辦,再想加點果肉怎麼辦,每一種功能的組合都得寫乙個新的抽象類

1,n extends aba extends abb,(如果非本地類則不行),當然你也可以讓糖去繼承奶,你再去繼承糖,但是這樣就會破壞原有層級結構,而且從物件導向上,顯然不合理,你憑什麼讓糖抽象類去繼承奶抽象類呢?

總結:你沒法同時繼承多個抽象類,你獲得混合型別的目的就是獲得組合後的功能,那麼除非你建立乙個抽象類,並把組合的功能都封裝其中。

3,借助介面,可以實現非層級的結構層次型別

和第二條類似,假如抽象類 singer 抽象類 writer 那麼如果乙個物件a既可以sing(),又可以write()怎麼辦呢,a就是乙個混合型別,是不屬於層級結構的。使用介面實現就很方便。舉個例子啊

介面:裝飾者模式 介面:milk,tea,coffee3個介面就可以實現加奶,加糖,加咖啡,加奶和糖,加奶和茶,加奶和咖啡,加奶和糖和咖啡,什麼都不加,8個功能。

抽象類:物件導向,8個功能由8個類實現。為什麼抽象類是這樣的呢,因為你每獲得乙個型別,擁有某個功能,也就意味著你放棄了獲得其餘型別,擁有其餘功能的機會。簡之,抽象類的型別是排他的。利用單一功能的介面就可以獲得組合功能,利用抽象類要想獲得組合功能,必須先將眾多功能組合並封裝與新的抽象類中

同時實現多個具有單一功能的介面,就可以獲得混合型別,組合功能。

而要想利用抽象類獲取組合功能,由於單繼承的存在,必須先建立具備組合功能的抽象類,於是,每一種功能的組合你就得去建立乙個抽象類,這就是組合**。

個人理解:並不是說你有了sing()方法,你就有了唱的功能,別的物件怎麼知道你有了sing()方法呢,別的物件要想使用sing()方法,只會去找singer介面的實現類,所以在物件導向中,你擁有了某些型別等價於你實現了某些功能。所以終極問題來了,抽象類和介面的優缺點主要圍繞,該用誰來給物件賦予新的型別,增加新的功能。

顯然是用介面,接**只需要implement一下,別的都不需要你做。

用抽象類,要麼會破壞原有類層次結構,要麼就只能新增眾多具有你需要功能的抽象類,造成組合**

總結:本節討論的重點是,介面和抽象類誰更方便給現有物件新增功能(本質上是獲得混合型別)

1,如果現有的抽象類有此功能,要麼打破現有的層級結構,讓上層類繼承此抽象類,不合理。要麼新寫乙個抽象類把原有的功能和新功能放在乙個新的抽象類中(組合**),直接繼承,不論哪種,都違反了開閉原則。

2,使用介面就很方便,不會組合**(只需要最基礎的單一功能介面),不會破壞原類層次結構(**需要就**實現)

effective java第4章 類和介面

第13條 使類和成員的可訪問性最小化 第一規則 盡可能地使每個類或成員不被外界訪問 只有當同乙個包內的另乙個類真正需要訪問乙個成員的時候,你才應該刪除private修飾符。如果方法覆蓋了超類中的乙個方法,子類中的訪問級別就不允許低於超類中的訪問級別。這樣可確保任何可使用超類例項的地方也可以使用子類的...

《effective Java》讀後筆記

為什麼區域性變數要宣告為 final 在jdk 1.8 之前,不用final修飾會編譯報錯。在jdk 1.8 中,不用final修飾不會報錯,但是一旦改變了變數的值就會報錯 區域性類如果乙個內部類需要在多個方法之外仍然是可見的,或者是它太長了,不適合於放在方法內部,就應該使用成員類。如果成員類的每個...

Effective Java閱讀筆記

通用程式設計 將區域性變數的作用域最小化,可以增強 的可讀性和可維護性,並降低出錯的可能性。要使區域性變數的作用域最小化,最有力的方法就是在第一次使用它的地方宣告。如果變數在使用之前宣告,只會造成混亂,過早地宣告區域性變數不僅會使它的作用域擴充套件,而且結束地也過於晚了。不要重新造輪子,一般而言,類...