誰にもアイデアはありますか、whyremoveRangeメソッド AbstractList (および ArrayList )もprotected
です?非常によく定義された便利な操作のように見えますが、それでも使用するには、List実装をサブクラス化する必要があります。
隠された理論的根拠はありますか?私にはまったく説明できないようです。
はい、外部コードから範囲を削除する方法ではないためです。代わりに、これを行います:
list.subList(start, end).clear();
これは、実際に舞台裏でremoveRange
を呼び出します。†
OPはremoveRange
がList
パブリックAPIの一部ではない理由を尋ねます。理由は、Effective Java 2nd edのItem 40に記載されています。
過度に長いパラメーターリストを短縮するには、3つの手法があります。 1つは、メソッドを複数のメソッドに分割することです。各メソッドは、パラメーターのサブセットのみを必要とします。不注意に行うと、これによりメソッドが多くなりすぎる可能性がありますが、直交性を高めることでメソッド数を減らすreduceもできます。たとえば、
Java.util.List
インターフェイス。サブリスト内の要素の最初または最後のインデックスを検索するメソッドは提供されません。両方とも3つのパラメーターが必要です。代わりに、2つのパラメーターを取り、サブリストのviewを返すsubList
メソッドを提供します。このメソッドをindexOf
またはlastIndexOf
メソッドと組み合わせて、それぞれが単一のパラメーターを持ち、目的の機能を実現できます。さらに、subList
メソッドは、List
インスタンスを操作して任意の計算を実行するanyメソッドと組み合わせることができます。サブリスト。結果のAPIは、非常に高い電力対重量比を持ちます。
removeRange
にはそれほど多くのパラメーターがないため、この処理の候補ではない可能性が高いと言えますが、removeRange
を介してsubList
を呼び出す方法があることを考えると、冗長な方法でList
インターフェースを乱雑にする理由はありません。
† AbstractList.removeRange
文書によると:
このメソッドは、このリストおよびそのサブリストの
clear
操作によって呼び出されます。リスト実装の内部を利用するためにこのメソッドをオーバーライドすると、実質的にこのリストとそのリストに対するclear
操作のパフォーマンスを改善できますsubLists。
また、OpenJDKの AbstractList.clear
および SubList.removeRange
。