我正在寻找一个现有的Java Set 实现,它在使用集合中已经存在的对象调用add方法时引发异常。有谁知道一个相当知名的图书馆是否存在?
编辑:这个问题似乎有很多困惑。我不是在问如何实现 set 接口。我需要向供应商提供一小段代码,而无需向他们发送包含我创建的自定义集合的库。他们将拥有可供他们使用的常用库(据我所知,它们是使用 Maven 设置的)。
我正在寻找一个现有的Java Set 实现,它在使用集合中已经存在的对象调用add方法时引发异常。有谁知道一个相当知名的图书馆是否存在?
编辑:这个问题似乎有很多困惑。我不是在问如何实现 set 接口。我需要向供应商提供一小段代码,而无需向他们发送包含我创建的自定义集合的库。他们将拥有可供他们使用的常用库(据我所知,它们是使用 Maven 设置的)。
您可以执行以下操作:
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class UniqueSet<E> extends HashSet<E> implements Set<E> {
private static final long serialVersionUID = 1L;
public UniqueSet() {
}
public UniqueSet(Collection<? extends E> c) {
super(c);
}
public UniqueSet(int initialCapacity) {
super(initialCapacity);
}
public UniqueSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
}
@Override
public boolean add(E e) {
if (super.contains(e))
throw new IllegalArgumentException("Already in set!");
return super.add(e);
}
}
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();
}
}