web-dev-qa-db-fra.com

Pouvez-vous étendre ArrayList en Java?

Est-il possible de créer une classe enfant qui étend ArrayList? Si c'est le cas, comment?

26
nambvarun

Vous pouvez étendre toute classe autre que final en Java. Cela dit, évitez les héritages s'il n'y a pas de relation true is-a. Considérez la composition pour la réutilisation. Lisez à propos de principe de substitution de Liskov

15
Aravind R. Yarram

Oui, vous pouvez.

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

Cependant, je ne suis pas sûr de savoir pourquoi vous voudriez faire cela.

20
helloworld922

Comme beaucoup d’autres l’ont dit, vous pouvez étendre la classe ArrayList, mais ce n’est pas quelque chose que vous devriez normalement faire; ce n'est pas considéré comme une bonne pratique en Java.

Je suis principalement un programmeur Java, mais ces derniers mois, j'ai également travaillé sur le code C #. Il semble que c'est un idiome courant en C # d'étendre les classes de collection standard si vous avez besoin d'une collection d'un type spécifique (en fait, je ne sais pas s'il s'agit d'un idiome courant en général - du moins les auteurs du code I ' je travaille avec le fais tout le temps).

Ainsi, s'ils ont une classe Person et qu'ils ont besoin d'une liste de personnes, ils créeraient une classe PersonList qui étend l'équivalent C # de ArrayList<Person>.

L'idiome commun en Java utiliserait simplement ArrayList<Person> si vous avez besoin d'une liste d'objets Person et ne créez pas de sous-classe spécifique à cet effet.

Je vous conseillerais de vous en tenir à la manière habituelle de procéder en Java et de ne pas créer vos propres sous-classes de ArrayList ou d'autres classes de collection.

9
Jesper

ArrayList n'est pas une classe finale et fournit un constructeur public, donc techniquement, il peut être étendu.

Mais la meilleure pratique consiste à delegate plutôt qu’à étendre . Voir: motif Décorateur

2

Comme d'autres l'ont dit, l'extension des structures de données Java Lang est une très mauvaise idée ... Cependant, si vous souhaitez isoler une logique dans une classe de collection, je suggérerais la solution suivante:

public class ProductCollection{

    ArrayList<Product> products;

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

Juste l'essayer. La classe n'est pas finale, son constructeur est public, vous pouvez donc. Cependant, ce n'est probablement pas une bonne idée pour un débutant.

La plupart du temps, ce n'est une bonne idée pour personne. Imaginez que vous ajoutez des fonctionnalités et obtenez ExtList1 extends ArrayList. L'un de vos collèges ajoute une fonctionnalité indépendante différente, vous avez donc ExtList2 extends ArrayList. Maintenant, vous les voulez tous les deux en même temps et vous n’avez plus de chance.

Ou vous avez besoin de la même fonctionnalité avec une implémentation de liste de base différente (peut-être LinkedList, bien que son utilisation soit pratiquement toujours fausse). Encore une fois, pas de chance.

Ce sont tous des cas où la délégation gagne. Il n’est pas nécessaire que ce soit plus bavard lorsque quelqu'un a déjà créé la base .


Je n'hériterais que de ArrayList, s'il y avait une très bonne raison de le faire exactement. Peut-être que certaines exigences de performance vraiment extrêmes sont basées sur des points de référence JMH appropriés.

0
maaartinus