【Effective Java】6、使用复合优先于使用继承
這個(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 域策略禁用usb
- 下一篇: Java学习笔记之:Java Strin