誰もが何か考えを持っていますか、なぜAbstractListの(そしてArrayListの)removeRangeメソッドがなぜprotected
ですか?非常に明確に定義された便利な操作のように見えますが、それでも、それを使用するには、List実装をサブクラス化する必要があります。
隠された根拠はありますか?私にはかなり不可解なようです。
誰もが何か考えを持っていますか、なぜAbstractListの(そしてArrayListの)removeRangeメソッドがなぜprotected
ですか?非常に明確に定義された便利な操作のように見えますが、それでも、それを使用するには、List実装をサブクラス化する必要があります。
隠された根拠はありますか?私にはかなり不可解なようです。
回答:
はい、それはあなたが外部コードから範囲を削除する方法ではないためです。代わりに、次のようにします。
list.subList(start, end).clear();
これは実際removeRange
には舞台裏を呼び出します。†
OPは、なぜパブリックAPIのremoveRange
一部ではないのかを尋ねList
ます。その理由は、Effective Java 2nd edのItem 40に記載されており、ここで引用します。
過度に長いパラメータリストを短縮する方法は3つあります。1つは、メソッドを複数のメソッドに分割することです。各メソッドは、パラメーターのサブセットのみを必要とします。不注意に行うと、メソッドの数が多くなりすぎる可能性がありますが、直交性を高めることでメソッド数を減らすのにも役立ちます。たとえば、
java.util.List
インターフェースについて考えてみます。サブリスト内の要素の最初または最後のインデックスを検索するメソッドは提供されません。どちらも3つのパラメーターが必要です。代わりにsubList
、2つのパラメーターを取り、サブリストのビューを返すメソッドを提供します。このメソッドをindexOf
orlastIndexOf
メソッドと組み合わせると、それぞれに単一のパラメーターがあり、目的の機能を実現できます。さらに、subList
メソッドは、インスタンスを操作する任意のメソッドと組み合わせてList
、サブリストに対して任意の計算を実行できます。結果のAPIは、非常に高い電力対重量比を持っています。
これremoveRange
はそれほど多くのパラメーターを持たないため、おそらくこの処理の候補ではないと主張できますが、をremoveRange
介して呼び出す方法があることを考えると、冗長なメソッドでインターフェースsubList
を混乱させる理由はありませんList
。
†AbstractList.removeRange
ドキュメントは言います:
このメソッドは
clear
、このリストとそのサブリストの操作によって呼び出されます。このメソッドをオーバーライドしてリスト実装の内部を利用すると、このリストとそのサブリストに対する操作のパフォーマンスを大幅に向上させることができclear
ます。
また、のOpenJDKのの実装を参照してくださいAbstractList.clear
とSubList.removeRange
。
removeRange
と、arraycopy
不必要にが呼び出されることに気づきArrayList
ましたか?hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/…これnumMoved
は0なので、arraycopyコード全体を1つにまとめることができますif
(で行ったようにremove
)。違いは、のarraycopyはない)B、)のarraycopyがオーバーヘッドを発生、ネイティブの呼び出しであるということです常に正しさのためのparamsをチェック stackoverflow.com/questions/12594046/...