2

既にセット内にあるオブジェクトでaddメソッドが呼び出されたときに例外をスローする既存のJava Set 実装を探しています。かなり有名なライブラリに存在するかどうかは誰にもわかりませんか?

編集:質問については多くの混乱があるようです。set インターフェイスの実装方法を尋ねているわけではありません。私が作成したカスタム コレクションを含むライブラリをベンダーに送信せずに、短いコード スニペットをベンダーに提供する必要があります。一般的に使用されるライブラリが利用可能になります (Maven でセットアップされていることがわかっています)。

4

2 に答える 2

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);
    }
}
于 2013-10-22T20:48:17.923 に答える
0

を拡張するよりも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();
    }
}
于 2013-10-22T21:13:40.187 に答える