HashSet addAll方法修改类内部字段

时间:2016-11-21 23:51:15

标签: java hashset

我有一个扩展HashSet参数化版本的类。该类有一个内部字段<div class="a class">a</div> <div class="b class">b</div> <div class="c class">c</div>,用于跟踪到目前为止已添加的元素数。子类覆盖基类“currentSizeadd方法,因此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)(这似乎没有任何意义)。

2 个答案:

答案 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