誰かが(2)を使用しているかどうか疑問に思っていますか?
はい。しかし、正当な理由(IMO)でめったにありません。
ArrayList
そして、人々は、使うべきときに使ったためにやけどを負いますList
:
誰かがやけどを負った例として、https://stackoverflow.com/a/1481123/139985では、ポスターは「スライス」に問題がArrayList.sublist(...)
ありArrayList
ましArrayList
た。彼のリスト変数のすべて。彼は、サブリストを新しい にコピーすることで問題を「解決」しましたArrayList
。
動作がどのように動作するかを知る必要があるという議論は、マーカー インターフェイスList
を使用することで大部分解決されます。RandomAccess
はい、少し不格好ですが、代替手段はさらに悪いです。
また、どのくらいの頻度で (1) を (2) よりも実際に使用する必要がありますか (つまり、(2) では不十分な場合です。「インターフェースへのコーディング」やベスト プラクティスなどは別として)。
質問の「どのくらいの頻度」の部分は、客観的に答えられません。
(そして、私は例を得ることができますか)
場合によっては、 API にないArrayList
メソッドをAPI で使用する必要がある場合があります。たとえば、、または. (そして最後のものは、メソッドが であることを宣言する ArrayList のサブタイプを作成した場合にのみ発生します。)List
ensureCapacity(int)
trimToSize()
removeRange(int, int)
public
それが、IMO インターフェイスではなくクラスにコーディングする唯一の正当な理由です。
(理論的には、パフォーマンスがわずかに向上する可能性があります...特定の状況下...一部のプラットフォームでは...しかし、最後の0.05%が本当に必要でない限り、これを行う価値はありません。これは正当な理由、IMO.)
ランダムアクセスが効率的かどうかを知らなければ、効率的なコードを書くことはできません。
それは有効な点です。ただし、Java はそれを処理するためのより良い方法を提供します。例えば
public <T extends List & RandomAccess> void test(T list) {
// do stuff
}
実装されていないリストでそれを呼び出すとRandomAccess
、コンパイル エラーが発生します。
動的にテストすることもできます ... を使用してinstanceof
... 静的な型付けが面倒な場合。また、リストがランダム アクセスをサポートしているかどうかに応じて、異なるアルゴリズムを (動的に) 使用するようにコードを記述することもできます。
ArrayList
を実装する唯一のリスト クラスではないことに注意してくださいRandomAccess
。その他にはCopyOnWriteList
、 、Stack
およびが含まれVector
ます。
私は人々がSerializable
(List
それを実装していないため)について同じ議論をするのを見てきました...しかし、上記のアプローチはこの問題も解決します。(ランタイム型を使用して解決できるArrayList
範囲で。任意の要素がシリアライズ可能でない場合、An はシリアライズに失敗します。)
最後に、「スタイルがいいから」とは言いません。その「理由」は、回りくどい議論 (「なぜそれが「スタイルが良い」のか?」) であると同時に、明言されていない (そしておそらく存在しない!) 上位の権威 (「スタイルが良い」と誰が言ったのか?) への訴えでもあります。 .
(インターフェイスにプログラムするのは良いスタイルだと思いますが、それを理由として挙げるつもりはありません。本当の理由を理解し、(IMO) 正しい結論に達する方が良いでしょう。文脈によっては、正しい結論が常に同じであるとは限りません。)