日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Effective Java】6、使用复合优先于使用继承

發(fā)布時(shí)間:2023/12/2 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Effective Java】6、使用复合优先于使用继承 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè),不管是什么書都會(huì)這樣說,因?yàn)槌3N覀儾⒉恍枰^承,而只是想把類進(jìn)行一定的擴(kuò)展,而我們想擴(kuò)展的屬性或方法對(duì)應(yīng)的類都有,這個(gè)時(shí)候如果兩者是is a的關(guān)系,這種關(guān)系是確實(shí)存在的,那么就可以使用繼承,不然一般都是建議使用復(fù)合。

?

如果我們隊(duì)一個(gè)類進(jìn)行繼承的時(shí)候,我們?nèi)绻麑?duì)其內(nèi)部的邏輯并不十分了解的時(shí)候,直接繼承的結(jié)果就是可能有些方法是類自己內(nèi)部調(diào)用的,而我們?cè)诶^承這個(gè)方法的時(shí)候,可能會(huì)覆蓋某些方法,或者重載某些方法,或者加上了一些自己的邏輯,這樣就會(huì)吧原來的邏輯和我們自己的邏輯混雜起來,并且如果繼承的類內(nèi)部有使用這個(gè)類的話,那么就會(huì)調(diào)用我們自己寫的部分邏輯,那么結(jié)果就變得不可預(yù)料了

?

這里的建議是使用包裝類模式

package cn.xf.cp.ch02.item16;import java.util.Collection; import java.util.Iterator; import java.util.Set;public class ForwardingSet<E> implements Set<E> {/*** 這個(gè)類作為轉(zhuǎn)發(fā)類,內(nèi)部通過復(fù)合的方式把set作為一個(gè)組件*/private final Set<E> s;public ForwardingSet(Set<E> s){this.s = s;}@Overridepublic int size(){return s.size();}@Overridepublic boolean isEmpty(){return s.isEmpty();}@Overridepublic boolean contains(Object o){return s.contains(o);}@Overridepublic Iterator<E> iterator(){return s.iterator();}@Overridepublic Object[] toArray(){return s.toArray();}@Overridepublic <T> T[] toArray(T[] a){return s.toArray(a);}@Overridepublic boolean add(E e){return s.add(e);}@Overridepublic boolean remove(Object o){return s.remove(o);}@Overridepublic boolean containsAll(Collection<?> c){return s.containsAll(c);}@Overridepublic boolean addAll(Collection<? extends E> c){return s.addAll(c);}@Overridepublic boolean retainAll(Collection<?> c){return s.retainAll(c);}@Overridepublic boolean removeAll(Collection<?> c){return s.removeAll(c);}@Overridepublic void clear(){s.clear();}}

?

這樣,我們?cè)诿總€(gè)方法中調(diào)用了私有成員的方法,那么私有成員對(duì)外部就是不可見的,它里面的方法就不會(huì)和外面的方法混雜起來

package cn.xf.cp.ch02.item16;import java.util.Collection; import java.util.Set;/*** *功能:包裝類*時(shí)間:下午9:58:36*文件:InstrumentedSet.java *@author xiaof ** @param <E>*/ public class InstrumentedSet<E> extends ForwardingSet<E> {private int addCount = 0; //用來統(tǒng)計(jì)set添加了多少元素public InstrumentedSet(Set<E> s){super(s);}@Overridepublic boolean add(E e){++addCount;return super.add(e);}@Overridepublic boolean addAll(Collection<? extends E> c){addCount += c.size();return super.addAll(c);}public int getAddCount(){return addCount;}}

?

轉(zhuǎn)載于:https://www.cnblogs.com/cutter-point/p/5866587.html

總結(jié)

以上是生活随笔為你收集整理的【Effective Java】6、使用复合优先于使用继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。