を拡張するよりもHashSet
、セットを保持してその動作を変更するラッパー クラスを定義する方がよいでしょう (Effective Java #16)。
import java.util.AbstractSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class FailFastSet<T> extends AbstractSet<T> {
private final Set<T> backer;
public FailFastSet() {
this(new HashSet<T>());
}
public FailFastSet(Set<T> set) {
backer = set;
}
@Override
public boolean add(T e) {
if (backer.contains(e))
throw new IllegalArgumentException(
"Cannot add "+e+" - equivalent object already exists.");
return backer.add(e);
}
@Override
public Iterator<T> iterator() {
return backer.iterator();
}
@Override
public int size() {
return backer.size();
}
}