第17條:要么為繼承而設(shè)計,并提供文檔說明,要么禁止繼承
1.如何編寫為繼承而設(shè)計的類?
(1)對于public或是protected的方法(非final)或是構(gòu)造器,在文檔中要說明它們調(diào)用了哪些自己的public或是protected類型的方法(非final),并說明調(diào)用順序,并說明每次調(diào)用的作用。
(2)文檔編寫完成,并發(fā)布新版本之后,后續(xù)的版本不能違背文檔中的細(xì)節(jié)。
(3)構(gòu)造器絕對不能調(diào)用可被覆蓋的方法。
(4)對于實現(xiàn)了Cloneable接口的類,在clone方法中不能調(diào)用可被覆蓋的方法。
(5)對于實現(xiàn)了Serializable接口的類,readResolve和writeReplace方法必須是protected的。
(6)對于實現(xiàn)了Serializable接口的類,在readObject方法中不能調(diào)用可被覆蓋的方法。
2. 如何將類設(shè)計成不可繼承的?
方法一:用final類型來申明這個類。
方法二:將類的構(gòu)造器申明為private類型的,然后用靜態(tài)工廠獲取到這個類的實例。
3.總結(jié)
要設(shè)計一個專門為繼承而設(shè)計的類是十分困難的,所以能用復(fù)合就用復(fù)合,如果需要被繼承的類沒有實現(xiàn)類型接口,不能實現(xiàn)復(fù)合包裝,并且該類還是需要被繼承的,那么請不要在可覆蓋的方法中調(diào)用其它可覆蓋方法,或者將想要覆蓋的父類方法拷貝一份出來到子類中,做成私有方法,然后用這個私有方法替代調(diào)用super.method()(method指的是方法名)。