Pouvez-vous étendre ArrayList en Java?

est-il possible de faire une classe d'enfant qui étend ArrayList? Si oui, comment?

26
demandé sur Tim Bender 2011-01-24 09:18:00

6 réponses

Vous pouvez étendre une classe qui n'est pas final en Java. Cela dit, vous devriez éviter l'héritage s'il n'y a pas de true relation. Envisager de réutiliser la composition. Lisez à propos de principe de substitution de Liskov

15
répondu Aravind R. Yarram 2011-01-24 06:20:58

Oui, vous pouvez.

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

cependant, je ne sais pas pourquoi vous voudriez faire cela.

19
répondu helloworld922 2011-01-24 06:41:05

Comme beaucoup d'autres l'ont dit, oui, 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 aussi travaillé sur le code C#. Il semble que C'est un idiome commun en C# pour étendre les classes de collection standard si vous avez besoin d'une collection d'un type spécifique (Je ne sais pas en fait si c'est un idiome commun en général - au moins les gens qui ont écrit le code je suis travailler avec font cela tout le temps).

donc s'ils ont une classe Person et ils ont besoin d'une liste de personnes, qu'ils avaient créer une classe PersonList qui étend L'équivalent en C de ArrayList<Person>.

l'idiome commun en Java serait juste d'utiliser ArrayList<Person> si vous avez besoin d'une liste de Person objets et de ne pas créer une sous-classe spécifique pour cela.

je vous conseille de vous en tenir à la façon Java courante de faire les choses, et de ne pas créer vos propres sous-classes de ArrayList ou d'autres les classes de collection.

9
répondu Jesper 2011-01-24 09:53:51

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

Mais la meilleure pratique est déléguer plutôt que de l'étendre. Voir: motif décorateur

2
répondu 卢声远 Shengyuan Lu 2011-01-24 06:29:17

il suffit de l'essayer. La classe n'est pas finale, le constructeur est public, donc vous pouvez. Cependant, il est probablement pas une bonne idée pour un débutant.

la Plupart du temps, c'est pas une bonne idée pour n'importe qui. Imaginez que vous ajoutez un peu de fonctionnalité et obtenez ExtList1 extends ArrayList. Une de vos universités ajoute une fonctionnalité indépendante différente, donc vous avez ExtList2 extends ArrayList. Maintenant tu les veux tous les deux en même temps et tu n'as pas 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 qu'il soit pratiquement toujours erroné de l'utiliser). Encore une fois, hors de la chance.

ce sont tous les cas où la délégation gagne. Il n'a pas besoin d'être plus prolixe quand quelqu'un a déjà créé la base.


j'avais seulement hérite de l' ArrayList, si il y avait une très bonne raison pour faire exactement cela. Peut-être que certains vraiment extrême exigences de performance basées sur des repères JMH appropriés.

0
répondu maaartinus 2017-08-18 10:39:49

comme d'autres l'ont dit, étendre les structures de données java lang est une très mauvaise idée. Cependant, si vous avez une certaine logique que vous voulez isoler dans une classe de collection, je suggérerais la solution de bellow:

public class ProductCollection{

    ArrayList<Product> products;

    public Product getByCode(String code) {
       // ... your logic goes here.
    }
}
0
répondu Ahmed Kooli 2018-04-04 12:48:57