/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
Ideone ideone = new Ideone();
ideone.mainlogic();
}
public void mainlogic() {
InstrumentedHashSet<String> s = new InstrumentedHashSet<>(new HashSet<String>());
s.
addAll(Arrays.
asList("A",
"I",
"P")); System.
out.
println(s.
getAddCount()); }
//ラッパークラス
class InstrumentedHashSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedHashSet(Set<E> s) {
super(s);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}
//再利用可能な転送クラス
class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) {
this.s = s;
}
@Override
public int size() {
return s.size();
}
@Override
public boolean isEmpty() {
return s.isEmpty();
}
@Override
public boolean contains
(Object o
) { return s.contains(o);
}
@Override
public Iterator<E> iterator() {
return s.iterator();
}
@Override
return s.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return s.toArray(a);
}
@Override
public boolean add(E e) {
return s.add(e);
}
@Override
public boolean remove
(Object o
) { return s.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return s.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends E> c) {
return s.addAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
return s.retainAll(c);
}
@Override
public boolean removeAll(Collection<?> c) {
return s.removeAll(c);
}
@Override
public void clear() {
s.clear();
}
@Override
public boolean equals
(Object o
) { return s.equals(o);
}
@Override
public int hashCode() {
return s.hashCode();
}
@Override
return s.toString();
}
}
}