繁体   English   中英

HashSet addAll方法修改类内部字段

[英]HashSet addAll method modifies class internal field

我有一个类扩展了HashSet的参数化版本。 该类有一个内部字段currentSize ,用于跟踪到目前为止已添加的元素数量。 子类覆盖基类的addaddAll方法,因此currentSize会相应增加。 我的问题是在addAll内部, addAll的大小被添加两次到currentSize计数器,而不是一次。 以下是我班级的代码:

public class InheritHashSet extends HashSet<Integer> {
    private int currentSize = 0;

    @Override
    public boolean add(Integer e) {
        currentSize++;
        super.add(e);
    }

    @Override
    public boolean addAll(Collection<? extends Integer> e) {
        currentSize += e.size();
        super.addAll(e);
    }

    public int getCurrentSize() {
        return currentSize;
    }
}

add方法似乎运行正常,因为在添加三个元素后, currentSize为3,但是以下将向currentSize而不是3添加6:

InheritHashSet ihs = new InheritHashSet();
Collection<Integer> c = new LinkedList<Integer>();
c.add(new Integer(0));
c.add(new Integer(1));
c.add(new Integer(2));
ihs.addAll(c);
System.out.println(ihs.getCurrentSize()); // prints 6 instead of 3

看起来对super.addAll(e)的调用也修改了currentSize (这似乎没有任何意义)。

扩展现有的集合类几乎绝不是一个好主意,特别是在您尝试执行新合同时。

我建议你重新设计你的类以获得HashSet字段而不是扩展HashSet。

阅读Joshua Bloch撰写的有效Java项目16:赞成组合而不是继承。

InheritHashSet类的addAll()方法首先设置currentSize = 3, currentSize += e.size(); 指令。 然后super.addAll(e); 调用add(e)方法三次。 对于动态绑定,首先调用类InheritHashSetpublic boolean add(Integer e) ,然后将currentSize递增到6。

因此,您应该以这种方式实现addAll方法:

@Override
public boolean addAll(Collection<? extends Integer> e) {
    return super.addAll(e);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM