RandomAccess
マーカーインターフェイスの元の目的を思い出す必要があります。別の方法にList
を渡す場合、ランダムアクセスまたはシーケンシャルリストに適したアルゴリズムを選択できる必要があります。適切なアルゴリズムを選択するには、list instanceof RandomAccess
を介してマーカーインターフェイスのテストが必要です。あなただけのList
インタフェースを実装する別のオブジェクトにリストをラップすると、すべてのそのような方法は、参照、今
(もreverse
、shuffle
、copy
、およびfill
を参照してください)one example
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}
を表示するには
がラッパーオブジェクトであるため、この情報は失われます。しかし、同期リストのようなラッパーは、get
のようなランダムアクセスメソッドの時間の複雑さを変更しません。したがって、ラップされたリストがランダムアクセスリストである場合、ラッパーはRandomAccess
も実装する必要があるため、そのようなラッパーを受信するメソッドは高速ランダムアクセスが使用可能かどうかを検出できます。
あなたはimplementation of SynchronizedRandomAccessList
を見れば、あなたはそれがないすべては、SynchronizedList
を拡張し、動作を継承するために、RandomAccess
実装し、高速なランダムアクセスを持つものとして自分自身をマーキングされていることがわかります。オーバーライドする唯一の方法は、まったく同じ理由でsubList
です。リストに効率的なランダムアクセスがある場合、そのサブリストも同様に実装されるので、RandomAccess
も実装する必要があります。
static class SynchronizedRandomAccessList<E>
extends SynchronizedList<E>
implements RandomAccess {
SynchronizedRandomAccessList(List<E> list) {
super(list);
}
SynchronizedRandomAccessList(List<E> list, Object mutex) {
super(list, mutex);
}
public List<E> subList(int fromIndex, int toIndex) {
synchronized (mutex) {
return new SynchronizedRandomAccessList<>(
list.subList(fromIndex, toIndex), mutex);
}
}
checkedList
のような他のラッパーファクトリは同じパターンに従います。だから、工場を組み合わせたときに、これはでも動作します:
System.out.println(
Collections.synchronizedList(Collections.checkedList(new ArrayList<>(), String.class))
instanceof RandomAccess);
→真
System.out.println(
Collections.synchronizedList(Collections.checkedList(new LinkedList<>(), String.class))
instanceof RandomAccess);
偽
文字列オブジェクトの継承→...あなたはそれが何のStringクラスがあってはならないことだと思いますか? – Stultuske
特定の 'List'実装がマーカーインタフェース' RandomAccess'を実装している場合、 'SynchronizedRandomAccessList'を返す必要があります。これはおそらく効率的なランダムアクセスを提供するリスト実装の方が効率的です。リストがランダムアクセスを提供しない場合、 'SynchronizedList'が使われるべきです。 – Jesper
@ Stultuske私の質問はなぜinstanceofのチェックを使用しているのですか? –