web-dev-qa-db-ja.com

JavaのAbstractListのremoveRange()メソッドが保護されているのはなぜですか?

誰にもアイデアはありますか、whyremoveRangeメソッド AbstractList (および ArrayList )もprotectedです?非常によく定義された便利な操作のように見えますが、それでも使用するには、List実装をサブクラス化する必要があります。

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

96
Joonas Pulakka

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

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

これは、実際に舞台裏でremoveRangeを呼び出します。


OPはremoveRangeListパブリック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

159