111

誰かが何か考えを持っていますか、 AbstractList(およびArrayList)のremoveRangeメソッドがなぜですか?非常に明確で便利な操作のように見えますが、それでも、それを使用するには、List実装をサブクラス化する必要があります。protected

隠された論理的根拠はありますか?私にはまったく説明できないようです。

4

1 に答える 1

179

はい、それは外部コードから範囲を削除する方法ではないためです。代わりに、これを行います。

list.subList(start, end).clear();

これは実際removeRangeには舞台裏を呼び出します。†</sup>


OPは、なぜパブリックAPIremoveRangeの一部ではないのかを尋ねます。Listその理由は、Effective Java 2nd edのアイテム40に記載されており、ここで引用します。

過度に長いパラメータリストを短縮するには、3つの手法があります。1つは、メソッドを複数のメソッドに分割することです。各メソッドは、パラメーターのサブセットのみを必要とします。不注意に行うと、メソッドが多すぎる可能性がありますが、直交性を高めることでメソッド数を減らすこともできます。たとえば、java.util.Listインターフェイスについて考えてみます。サブリスト内の要素の最初または最後のインデックスを見つけるメソッドは提供されていません。どちらも3つのパラメーターを必要とします。代わりに、 2つのパラメーターを受け取り、サブリストのビューsubListを返すメソッドを提供します。このメソッドは、それぞれが単一のパラメーターを持つorメソッドと組み合わせて、目的の機能を生成できます。また、indexOflastIndexOfsubListメソッドは、インスタンスを操作する任意のメソッドと組み合わせてList、サブリストに対して任意の計算を実行できます。結果として得られるAPIは、非常に高いパワーウェイトレシオを備えています。

removeRangeそれほど多くのパラメータを持たないため、おそらくこの処理の候補ではないと主張することができますが、をremoveRange介して呼び出す方法があることを考えると、冗長なメソッドでインターフェイスsubListを乱雑にする理由はありません。List


†</sup>AbstractList.removeRangeドキュメントには次のように書かれています。

このメソッドはclear、このリストとそのサブリストの操作によって呼び出されます。リスト実装の内部を利用するためにこのメソッドをオーバーライドすると、このリストとそのサブリストでの操作のパフォーマンスを大幅に向上させることができます。clear

また、OpenJDKのとの実装も参照してAbstractList.clearくださいSubList.removeRange

于 2010-02-18T14:16:42.410 に答える