我有一个扩展HashSet参数化版本的类。该类有一个内部字段<div class="a class">a</div>
<div class="b class">b</div>
<div class="c class">c</div>
,用于跟踪到目前为止已添加的元素数。子类覆盖基类“currentSize
和add
方法,因此addAll
会相应增加。我的问题是在currentSize
内,集合的大小被添加到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
为3,但以下内容将为currentSize
而不是3添加6:
currentSize
看起来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)
(这似乎没有任何意义)。
答案 0 :(得分:2)
扩展现有的集合类几乎绝不是一个好主意,特别是在您尝试执行新合同时。
我建议你重新设计你的类以获得HashSet字段,而不是扩展HashSet。
阅读Effective Java by Joshua Bloch第16项:赞成组合而不是继承。
答案 1 :(得分:2)
addAll()
类的InheritHashSet
方法首先使用currentSize += e.size();
指令设置currentSize = 3。然后super.addAll(e);
调用add(e)
方法三次。对于动态绑定,首先调用类public boolean add(Integer e)
的{{1}},然后将InheritHashSet
递增到6。
因此您应该以这种方式实现currentSize
方法:
addAll