你的位置:首页 > 软件开发 > Java > EffectiveJava读书笔记——复合优先于继承

EffectiveJava读书笔记——复合优先于继承

发布时间:2016-06-14 22:01:23
继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全。想到了很有名的一句话,你永远不知道你的用户是如何使用你写的程序的,一个程序员继承另一个程序员写的类也是同样的危险。 ...

      继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全。想到了很有名的一句话,你永远不知道你的用户是如何使用你写的程序的,一个程序员继承另一个程序员写的类也是同样的危险。

      于方法调用不同的是,继承打破的封装性。换句话说,子类依赖于其超类**定功能的实现细节。超类的实现有可能随着发行版本的不同而变化,如果真的发生了变化,子类可能会遭到破坏,即使它的代码完全没有修改过。因而,子类有必要随着超类的更新而演变。

      为了说明的更加具体一些,假设有一个程序使用了HashSet,想要查询它被创建以来添加了多少个元素,编写一个hashSet变量,它记录下试图插入的元素数量,并有一个访问数量的方法

/** * 复合优先与继承 * @author weishiyao * * @param <E> */// Broken - Inappropriate use of inheritancepublic class InstrumentedHashSet<E> extends HashSet<E> {	// The number of attempted element insertions	private int addCount = 0;		public InstrumentedHashSet() {	}		public InstrumentedHashSet(int initCap, float loadFactor) {		super(initCap, loadFactor);	}		@Override	public boolean add(E e) {		addCount++;		return super.add(e);	}		@Override	public boolean addAll(Collection<? extends E> c) {		addCount += c.size();		return super.addAll(c);	}		public int getAddCount() {		return addCount;	}}

原标题:EffectiveJava读书笔记——复合优先于继承

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。