Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InstrumentedHashset和重写add&;阿道尔_Java_Inheritance_Collections - Fatal编程技术网

Java InstrumentedHashset和重写add&;阿道尔

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

在《有效Java第二版》第16项中,作者提供了一个场景,说明了
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类进行子类化的代码,并对超类的行为做出了不必要的假设。