Java InstrumentedHashset和重写add&;阿道尔
在《有效Java第二版》第16项中,作者提供了一个场景,说明了Java InstrumentedHashset和重写add&;阿道尔,java,inheritance,collections,Java,Inheritance,Collections,在《有效Java第二版》第16项中,作者提供了一个场景,说明了InstrumentedHashSet从HashSet继承并覆盖两个方法add()和addAll()。我的问题是,为什么以下替代方案不能永远解决我们的问题?可能出现什么样的新问题: public class InstrumentedHashSet<E> extends HashSet<E> { // The number of attempted element insertions priv
InstrumentedHashSet
从HashSet
继承并覆盖两个方法add()
和addAll()
。我的问题是,为什么以下替代方案不能永远解决我们的问题?可能出现什么样的新问题:
public 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);
}
/* only the add method has been overrided
@Override public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
*/
public int getAddCount() {
return addCount;
}
}
公共类InstrumentedHashSet扩展了HashSet{
//尝试插入元素的次数
私有int addCount=0;
公共指令集hashset(){
}
公共InstrumentedHashSet(int initCap,float loadFactor){
super(初始上限、荷载系数);
}
@重写公共布尔加法(E){
addCount++;
返回super.add(e);
}
/*只有add方法被重写
@覆盖公共布尔值addAll(集合如果删除对addAll
的覆盖,则插入指令的HashSet
在HashSet
中的addAll
的实现中可能会发生更改
目前,它忠实地为每个项目调用add
:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next())) // <<== This will call your override
modified = true;
}
return modified;
}
public boolean addAll(CollectionI不知道InstrumentedHashSet如何容易受到外接程序HashSet实现更改的影响。请您详细说明一下,并提供更多详细信息。@ecdhe对不起,我的意思是说addAll
的实现。如果他们不再对c
的每一项调用add
,您的override将不会被调用,而addCount将不同步。什么会促使Oracle中的Java语言设计人员更改哈希集实现?这会不会破坏许多Java程序的设计,而这些程序都预先知道addAll调用会在其实现中添加?更改内部实现deta有很多原因HashSet几乎每一个版本都有所改变。根据HashSet的内部实现细节,“使用预先的知识进行设计,”正在破坏封装。一般来说,只要API的所有记录属性保持为真,即使实现细节发生更改,您的代码也应该继续工作。另一个风险是,JDK API中添加了一个新方法,这是偶尔发生的。当这种情况发生时,它的实现很可能会操纵数据结构直接调用ctures而不是调用公共方法,如add
。这在过去已经发生过,它破坏了对JDK类进行子类化的代码,并对超类的行为做出了不必要的假设。