[英]HashSet addAll method modifies class internal field
我有一个类扩展了HashSet的参数化版本。 该类有一个内部字段currentSize
,用于跟踪到目前为止已添加的元素数量。 子类覆盖基类的add
和addAll
方法,因此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)
方法三次。 对于动态绑定,首先调用类InheritHashSet
的public 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.