webentwicklung-frage-antwort-db.com.de

Können Sie ArrayList in Java erweitern?

Ist es möglich, eine untergeordnete Klasse zu erstellen, die ArrayList erweitert? Wenn das so ist, wie?

26
nambvarun

Sie können jede Klasse erweitern, die in Java nicht final ist. Trotzdem sollten Sie die Vererbung vermeiden, wenn keine true is-a - Beziehung besteht. Erwägen Sie die Zusammensetzung zur Wiederverwendung. Lesen Sie über Liskov-Substitutionsprinzip

15

Ja, du kannst.

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

Ich bin mir jedoch nicht sicher, warum Sie dies tun möchten.

20
helloworld922

Wie viele andere bereits gesagt haben, können Sie die Klasse ArrayList erweitern, aber normalerweise sollten Sie dies nicht tun. Es wird in Java nicht als bewährte Methode angesehen.

Ich bin hauptsächlich Java-Programmierer, aber in den letzten Monaten habe ich auch an C # -Code gearbeitet. Es scheint, dass es in C # eine verbreitete Redewendung ist, die Standardsammlungsklassen zu erweitern, wenn Sie eine bestimmte Auflistung benötigen (ich weiß eigentlich nicht, ob es eine allgemeine Redewendung ist - zumindest die Leute, die den Code geschrieben haben. ' Ich arbeite ständig damit.).

Wenn sie also eine Klasse Person haben und eine Liste von Personen benötigen, würden sie eine Klasse PersonList erstellen, die das C # -Äquivalent von ArrayList<Person> erweitert.

Das übliche Idiom in Java würde nur ArrayList<Person> verwenden, wenn Sie eine Liste von Person-Objekten benötigen, und nicht dafür eine bestimmte Unterklasse erstellen.

Ich empfehle Ihnen, sich an die üblichen Java-Methoden zu halten und keine eigenen Unterklassen von ArrayList oder anderen Collection-Klassen zu erstellen.

9
Jesper

ArrayList ist keine endgültige Klasse und stellt einen öffentlichen Konstruktor bereit, sodass sie technisch erweitert werden kann.

Die beste Vorgehensweise ist jedoch delegate und nicht erweitern . Siehe: Dekorationsmuster

Wie andere bereits sagten, die Erweiterung von Java-Lang-Datenstrukturen ist eine sehr schlechte Idee. Wenn Sie jedoch eine Logik haben, die Sie in einer Collection-Klasse isolieren möchten, würde ich folgende Lösung vorschlagen:

public class ProductCollection{

    ArrayList<Product> products;

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

Probieren Sie es einfach aus. Die Klasse ist nicht final, der Konstruktor ist öffentlich, also können Sie das tun. Es ist jedoch wahrscheinlich keine gute Idee für einen Anfänger.

Meistens ist es für niemanden eine gute Idee. Stellen Sie sich vor, Sie fügen einige Funktionen hinzu und erhalten ExtList1 extends ArrayList. Ein College von Ihnen fügt eine andere unabhängige Funktionalität hinzu, so dass Sie ExtList2 extends ArrayList haben. Jetzt willst du beide gleichzeitig und hast kein Glück.

Oder Sie benötigen dieselbe Funktion mit einer anderen Basislistenimplementierung (möglicherweise LinkedList, obwohl es praktisch immer falsch ist, sie zu verwenden). Wieder aus Pech.

In all diesen Fällen gewinnt die Delegation. Es muss nicht ausführlicher sein, wenn jemand die Basis bereits erstellt hat .


Ich würde nur von ArrayList erben, wenn es einen sehr guten Grund gab, genau dies zu tun. Vielleicht einige wirklich extreme Leistungsanforderungen, die auf den richtigen JMH-Benchmarks basieren.

0
maaartinus