4

ソートされたコレクションを実装していると仮定します(単純な例-Setソートされた配列に基づく)。この(不完全な)実装について考えてみます。

import java.util.*;

public class SortedArraySet<E> extends AbstractSet<E> {

    @SuppressWarnings("unchecked")
public SortedArraySet(Collection<E> source, Comparator<E> comparator) {
    this.comparator = (Comparator<Object>) comparator;
    this.array = source.toArray();
    Arrays.sort(this.array, this.comparator);
}

@Override
public boolean contains(Object key) {
    return Arrays.binarySearch(array, key, comparator) >= 0;
}

    private final Object[] array;

    private final Comparator<Object> comparator;

}

それでは、整数のセットを作成しましょう

Set<Integer> s = new SortedArraySet<Integer>(Arrays.asList(1, 2, 3), null);

そして、特定の値が含まれているかどうかをテストします。

System.out.println(s.contains(2));
System.out.println(s.contains(42));
System.out.println(s.contains("42"));

上記の3行目は。をスローしClassCastExceptionます。私が欲しいものではありません。私はそれが戻ってくることを望みますfalseHashSetそうです)。

例外をキャッチしてfalseを返すことで、この動作を得ることができます。

@Override    
public boolean contains(Object key) {
    try {
        return Arrays.binarySearch(array, key, comparator) >= 0;
    } catch (ClassCastException e) {
        return false;
    }
}

sourceコレクションが正しく入力されていると仮定すると、これを行うと何がうまくいかない可能性がありますか?

4

3 に答える 3

3

Javadoc for は a のスローはオプションCollection.containsであると明確に述べているため、これに問題はないと思います。ClassCastException

私が見る唯一の問題は、どこかにバグがある場合、例外をスローしないと、それを特定できないことです。

于 2011-01-12T22:18:07.423 に答える
1

クラスは互換性のない引数を(セットで使用されると互換性のない)にTreeSetスローします。したがって、その例外をスローしても問題はありません。これが発生する可能性があることを文書化してください。ClassCastExceptioncontains()Comparator

于 2011-01-12T23:00:04.120 に答える
1

CCE が contains() からスローすることは完全に正当です。ただし、多くのコレクションの実装はそれをキャッチして false を返します。これも完全に正当であると考えており、実際、よりユーザー フレンドリーな動作です。

equals() では、選択肢がありません。そのCCEをキャッチする必要があります。

チェックされていない例外をキャッチすることは常に汚いと感じるべきですが、時にはそれが正しいことです。

于 2011-01-19T19:57:33.227 に答える