Java - welchen Unterschied macht es bei Listen ob ich das Interface nutze oder nicht?

4 Antworten

Es gibt noch viele weitere List-Implementierungen. Zum Beispiel der Stack, die LinkedList. Einige weitere Spezialisierungen, wie die synchronisierte Liste.

Wenn du eine Liste nur kurz in deiner eigenen Methode brauchst, nicht zurückgibst, mag es überflüssig erscheinen, das Interface zu nutzen. Richtig. Aber gerade als Methoden-Argumente oder Rückgabewerte, als Objekt-Variablen, ist es deutlich hilfreicher, immer ein Interface zu nutzen, vielleicht sogar das noch allgemeinere Collection-Interface oder gar das Iterable-Interface.

Warum? Nichts ist nerviger, als eine Methode, die von einer konkreten Implementierung abhängt. Stell dir vor, du hast nur einen Stack, aber eine Methode verlangt eine Array-List, obwohl sie nur über die Elemente iteriert. Du musst erst alles rüber kopieren, dann übergeben. Du verbrauchst unnötig Rechnerleistung und unnötig Speicher.

Woher ich das weiß:Berufserfahrung

Je abstrakter der Variablentyp den du benutzt desto einfacher lässt sich hinterher der Code anpassen, falls du die Implementierung austauschen willst. Sagen wir du stolperst irgendwann auf eine LinkedList, VectorList oder UniqueList die besser für dein Szenario geeignet ist (wegen Performance, Features oder sonstwas), aber nicht von ArrayList abgeleitet ist. Je weniger der Code über den konkreten Typ wissen muss, desto besser.

Je konkreter der Variablentyp den du benutzt, desto spezifischere Methoden hast du zur Verfügung. Wenn die konkrete Implementierung von ArrayList etwas kann was du brauchst, dann macht es Sinn ArrayList zu verwenden.

Also, die Devise lautet: So abstrakt wie möglich, so konkret wie nötig. Versuch immer gegen Interfaces zu programmieren. Reicht die Verwendung von List, Collectable oder Iterable in deinem Code, benutz diese Interfaces für die Variable

Wenn du du die vorher selbst definierst kannst du auch ArrayList nehmen. Bekommst du die aber z.B. als Parameter übergeben, erlaubt halt List jede Klasse, die das Interface implementiert, also neben ArrayList also z.B. auch Vector oder LinkedList.

Woher ich das weiß:Beruf – Softwareentwickler & Admin

Grundsätzlich rate ich zum Einsatz von Generic, also zum Beispiel:

List<String> lines = new ArrayList<>();

Generics gibt es in Java seit Version 5 und haben viele Vorteile.

In Java wird grundsätzlich gegen Interfaces implementiert, also so, wie ich es im Beispiel beschreibe. Auch wenn Du mit Rückgabewerten bei Methoden oder Parametern arbeitest, verwendest Du stets Interfaces. Das gilt grundsätzlich für alle Collections, also List, Set etc.

Woher ich das weiß:Studium / Ausbildung

Was möchtest Du wissen?