欺骗上的Java Set异常

时间:2013-10-22 20:38:01

标签: java collections set

我正在寻找一个现有的 Java Set实现,当使用已经在集合中的对象调用add方法时会抛出异常。有谁知道一个相当知名的图书馆中是否存在一个?

编辑:这个问题似乎有很多混乱。我不是问如何实现set接口。我需要向供应商提供一小段代码,而不是向他们发送一个包含我自己创建的自定义集合的库。他们将拥有常用的库(我知道它们已经与Maven一起设置)。

2 个答案:

答案 0 :(得分:1)

您可以采取以下措施:

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);
    }
}

答案 1 :(得分:0)

根据Effective Java#16,您最好定义一个包含集合并修改其行为的包装类,而不是扩展HashSet

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();
    }
}