У меня есть класс, который расширяет параметризованную версию HashSet. Этот класс имеет внутреннее поле currentSize
, которое отслеживает, сколько элементов было добавлено до сих пор. Класс child переопределяет базовый класс 'add
и addAll
, поэтому соответственно увеличивается currentSize
. Моя проблема заключается в том, что внутри addAll
размер набора добавляется два раза к счетчику currentSize
, не один раз. Ниже мой класс Код:Метод hashSet addAll изменяет внутреннее поле класса
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, но следующий будет добавить 6 к currentSize
вместо 3:
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
(это, похоже, не имеет никакого смысла).
Что 'super.addAll (е), 'делать? –
Именно поэтому вы не должны распространять HashSet, но вместо этого используйте * HashSet. Обратите внимание, что currentSize очень плохо назван. Это совсем не размер. И если бы это было так, это было бы бесполезно, поскольку у HashSet уже есть размер. –
@JBNizet Я знаю, что размер можно определить с помощью метода 'size()' HashSet, мне просто интересно, почему этот метод подсчета числа элементов в наборе не дает правильного ответа. – Polb