3

私はCollections.shuffle(List)javadocを読んでいて、 RandomAccessjavadocを調べました。

リストの実装で使用されるマーカーインターフェイスは、高速(通常は一定時間)のランダムアクセスをサポートしていることを示します。[...]

このインターフェイス(Serializableなど)にメソッドがないのはなぜですか?これの設計上の理由は何ですか?

Listsだけがこのインターフェースを「実装」しているとしても、Eget()をメソッドとして設定してみませんか?すべてのリストがランダムアクセスであるとは限りませんが、メソッドがない場合にこのインターフェイスを使用するにはどうすればよいですか?

このようなもの:

if(object instanceof RandomAccess){
    // should I cast it if no operations can be done? why?
}

また、リストのみがRandomAccessになることができますか?ファイルはどうですか?

4

2 に答える 2

10

「マーカー」インターフェースは、注釈よりも前の手法です。これは、クラスがメソッドに関するものではない、ある標準に準拠していることをクラスにマークすることを目的としています。

この場合、シャッフルは、クイックランダムアクセスをサポートしていないリストに対して異なる動作をする可能性があります。リンクリストをどのようにシャッフルするかを検討してください。難しいですよね?次の要素へのポインタをたどって、リストをウォークスルーせずに「ランダムな要素を取得してください」とだけ言うことはできません。ここで、これをArrayListと対比します。リストの保存方法により、ランダムな要素を取得する方がはるかに簡単です。

メソッド名に「リストの保存方法」や「さまざまなアクセスパターンの速度の速さや遅さ」を限定する方法はありません。したがって、代わりに、Javaはマーカーインターフェイスを使用してこの情報を提供します。

この場合、ArrayListはRandomAccessになりますが、LinkedListはそうではありません。

編集

マーカーインターフェイスとマーカー注釈の違いに興味がある人は、JoshuaBlochによるEffectiveJava 2nd Editionの項目37:「マーカーインターフェイスを使用してタイプを定義する」をお楽しみください。

于 2012-11-25T02:38:34.443 に答える
1

これはマーカーインターフェイスです。これは、追加のメソッドを使用しない動作または機能を定義します。

この場合、ランダムアクセス(リストインターフェイスですでに定義されている)が可能であるだけでなく、効率的でもあることを示しています。Listを使用するコードは、これに従ってアルゴリズムを切り替えることができます。

それが良い設計上の決定であるかどうかを議論することができます。たとえば、ランダムアクセスメソッドをリストから削除して(反復のみを許可)、代わりにRandomAccessインターフェイスに配置することができます。同様に、オブジェクトシリアル化システムのメソッドは、Serializableインターフェイスに配置できます。

また、リストのみがRandomAccessになることができますか?

このインターフェースは他の用途にも使用できると思いますが、現在はリストでのみ使用されているようです。

ファイルはどうですか?

ファイルへのランダムアクセスには別のメカニズムがあります(java.io.RandomAccessFile)。

于 2012-11-25T02:38:21.377 に答える