web-dev-qa-db-ja.com

JavaでArrayListを拡張できますか?

ArrayListを拡張する子クラスを作成することは可能ですか?もしそうなら、どのように?

27
nambvarun

Javaでfinalでないクラスを拡張できます。とはいえ、true is-a関係がない場合は、継承を避ける必要があります。再利用のために構成を検討してください。 リスコフ置換原理 について読む

17

はい、できます。

public class MyArrayList<E> extends ArrayList<E>
{
}

しかし、なぜこれをしたいのかはわかりません。

21
helloworld922

他の多くの人が言ったように、はい、クラスArrayListを拡張できますが、通常は行うべきではありません。 Javaのグッドプラクティスとは見なされません。

私は主にJavaプログラマですが、過去数か月はC#コードにも取り組んでいます。必要であれば標準コレクションクラスを拡張するC#の一般的なイディオムのようです特定の型のコレクション(それが一般的な一般的なイディオムかどうかは実際にはわかりません-少なくとも、私が作業しているコードを書いた人は常にこれを行っています)。

したがって、クラスPersonがあり、個人のリストが必要な場合は、C#の_ArrayList<Person>_に相当するクラスを拡張するクラスPersonListを作成します。

Java)の一般的なイディオムは、Personオブジェクトのリストが必要な場合に_ArrayList<Person>_を使用し、このための特定のサブクラスを作成しない場合です。

一般的なJava物事のやり方に固執し、ArrayListまたは他のコレクションクラスの独自のサブクラスを作成しないことをお勧めします。

10
Jesper

ArrayListはfinalクラスではなく、パブリックコンストラクターを提供するため、技術的には拡張可能です。

しかし、ベストプラクティスは拡張ではなくdelegateです。参照: 装飾パターン

他の人が言ったように、Java langデータ構造を拡張することは非常に悪い考えです。ただし、コレクションクラスで分離したいロジックがある場合は、以下のソリューションをお勧めします。

public class ProductCollection{

    ArrayList<Product> products;

    public Product getByCode(String code) {
       // ... your logic goes here.
    }
}
0
Ahmed Kooli

試してみてください。クラスはfinalではなく、コンストラクターはpublicなので、できます。ただし、初心者にはおそらく良い考えではありません。

ほとんどの場合、それは誰にとっても良い考えではありません。いくつかの機能を追加してExtList1 extends ArrayList。あなたの大学は異なる独立した機能を追加するので、ExtList2 extends ArrayList。今、あなたはそれらの両方を一度に欲しいので、あなたは運が悪いです。

または、異なるベースリストの実装で同じ機能が必要です(LinkedListかもしれませんが、使用するのは事実上常に間違っています)。再び、運が悪い。

これらはすべて、委任が勝った場合です。 誰かがすでにベースを作成している の場合、より冗長である必要はありません。


まさにこれを行う非常に正当な理由があった場合、私はArrayListからのみ継承します。たぶん、適切なJMHベンチマークに基づくいくつかの極端なパフォーマンス要件。

0
maaartinus