【Effective Java】6、使用复合优先于使用继承
生活随笔
收集整理的這篇文章主要介紹了
【Effective Java】6、使用复合优先于使用继承
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個,不管是什么書都會這樣說,因為常常我們并不需要繼承,而只是想把類進行一定的擴展,而我們想擴展的屬性或方法對應的類都有,這個時候如果兩者是is a的關系,這種關系是確實存在的,那么就可以使用繼承,不然一般都是建議使用復合。
?
如果我們隊一個類進行繼承的時候,我們如果對其內部的邏輯并不十分了解的時候,直接繼承的結果就是可能有些方法是類自己內部調用的,而我們在繼承這個方法的時候,可能會覆蓋某些方法,或者重載某些方法,或者加上了一些自己的邏輯,這樣就會吧原來的邏輯和我們自己的邏輯混雜起來,并且如果繼承的類內部有使用這個類的話,那么就會調用我們自己寫的部分邏輯,那么結果就變得不可預料了
?
這里的建議是使用包裝類模式
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> {/*** 這個類作為轉發類,內部通過復合的方式把set作為一個組件*/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();}}?
這樣,我們在每個方法中調用了私有成員的方法,那么私有成員對外部就是不可見的,它里面的方法就不會和外面的方法混雜起來
package cn.xf.cp.ch02.item16;import java.util.Collection; import java.util.Set;/*** *功能:包裝類*時間:下午9:58:36*文件:InstrumentedSet.java *@author xiaof ** @param <E>*/ public class InstrumentedSet<E> extends ForwardingSet<E> {private int addCount = 0; //用來統計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;}}?
轉載于:https://www.cnblogs.com/cutter-point/p/5866587.html
總結
以上是生活随笔為你收集整理的【Effective Java】6、使用复合优先于使用继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 域策略禁用usb
- 下一篇: Java学习笔记之:Java Strin