Implementierung gegen Interfaces / List, ArrayList, LinkedList

Status
Nicht offen für weitere Antworten.

Sergeant_Pepper

Bekanntes Mitglied
Hallo,
zur Verwendung der verschiedenen Listen (Vor- und Nachteile) habe ich schon einige Beiträge hier im Forum gelesen. Tlw. wird dann auch darauf verwiesen, dass man vorzugsweise gegen eine Schnittstelle (z.B. List) implementieren soll, anstatt gegen die konkrete Klasse (ArrayList, LinkedList, ...).

Nun schreibe ich gerade ein wrapper-Package zu einem Web Service.

Da habe ich eine Methode wie diese geschrieben:
Java:
public List<Friend> getFriends()
{
    List<Friend> friends=new LinkedList<Friend>();
    while (..)
    {
         friends.add(...);
    }
...
    return friends;
}

Der Aufrufer bekommt also eine List. Das in der Methode eine LinkedList erzeugt wurde, bleibt ihm verborgen.

Aber die Wahl der konkreten Liste kann doch unter Umständen gravierende Auswirkungen haben (z.B. Performance). Das heißt, dass der Programmierer, der getFriends() verwendet, schon wissen sollte, was die Methode konkret tut (nämlich eine LinkedList erzeugen, die tlw. langsamer als eine ArrayList sein kann).

Deshalb würde ich es in diesem Zusammenhang sinnvoller finden, getFriends eine konkrete Liste (z.B. LinkedList) zurückgeben zu lassen. Dann weiß der Anwender, womit er es zu tun hat.

Oder verstehe ich da etwas falsch?
 

Noctarius

Top Contributor
Normalerweise benutzt man dann entweder Dependency Injection oder eine Factory Klasse, welche die entsprechende Implementierung (bzw eine Instanz dieser) zurück gibt.
 

Sergeant_Pepper

Bekanntes Mitglied
Dependency Injection ist mir völlig neu, noch nie gehört...

Factories sagen mir etwas. Den Bezug zu meinem Fall sehe ich aber noch nicht. Muss wohl noch etwas lesen... :rtfm:

Danke schon mal... :)
 

faetzminator

Gesperrter Benutzer
Stell dir vor getFriends() gibt dir eine LinkedList statt einer List zurück. Wenn du nun - z.B. aus Performancegründen - die Implementierung auf eine ArrayList ändern willst, dann ändert sich die Methodensignatur und du bist nicht mehr kompatibel zu den anderen Versionen. Schlimmer noch: Was ist, wenn du eine lib öffentlich verteilst? Dann geht das schon mal gar nicht.
 
G

Gastredner

Gast
Wäre es nicht ein möglicher Ausweg, dem Programmierer zwei Methoden anzubieten? Einer Methode könnte er eine beliebige Liste übergeben, während die zweite nur die erste Methode mit einer neu erzeugten Liste aufruft:
Java:
public List<Friend> getFriends() {
	return getFriends(new LinkedList<Friend>());
}

public List<Friend> getFriends(List<Friends> list) {
    while (/* Bedingung */) {
		list.add(/* Ein Freund */);
    }
	//...
    return list;
}
So hätte dein Gegenüber die freie Wahl, welche Liste er verwenden will.
 

Sergeant_Pepper

Bekanntes Mitglied
@faetzminator:
... Implementierung auf eine ArrayList ändern willst, dann ändert sich die Methodensignatur und du bist nicht mehr kompatibel zu den anderen Versionen. Schlimmer noch: Was ist, wenn du eine lib öffentlich verteilst? Dann geht das schon mal gar nicht.

Das verstehe ich völlig. Aber wenn man nur eine List zurückgeben will (aus den Gründen, die du genannt hast), sollte man doch wenigstens dokumentieren, welche konkrete List intern verwendet wird, damit jeder weiß, woran er ist.
Oder nicht?
 
B

bygones

Gast
(nämlich eine LinkedList erzeugen, die tlw. langsamer als eine ArrayList sein kann).
ist sie nur dann wenn man index basiert auf sie zugreift - ergo einfach Collection reintun und gut ist.

Mit DI bzw Factory wäre hier nicht wirklich geholfen, da man auch hier nur mit dem interface als verwender zu tun bekommt.

Wenn es wirklich performancekritisch ist (und das ist in über 90% der fälle nicht) dass man eine ganz bestimmte Implementierung braucht und nur die - dann muss natürliche auch diese verwenden !
 

faetzminator

Gesperrter Benutzer
Kann man, muss man aber nicht. Ist halt Ansichtssache... ich finde Gastredners Idee toll, allerdings noch NPE-sicher:
Java:
public List<Friend> getFriends() {
    return getFriends(null);
}
 
public List<Friend> getFriends(List<Friend> list) {
    if (list == null) {
        list = new LinkedList<Friend>();
    }
    while (/* Bedingung */) {
        list.add(/* Ein Freund */);
    }
    //...
    return list;
}
 

Sergeant_Pepper

Bekanntes Mitglied
zum Vorschlag von Gastredner bzw. faetzminator:

eine der beiden Methoden müsste dann doch einen konkreten Rückgabetyp (LinkedList) haben?
 

faetzminator

Gesperrter Benutzer
Nö. Es geht lediglich darum, dass der Programmierer selbst entscheiden kann, was für eine List er verwendet. Falls dieser in seinem Code LinkedList<...> = ... schreibt, hat er das Prinzip nicht verstanden ;)
 

Sergeant_Pepper

Bekanntes Mitglied
Ja, ich glaub jetzt hab ichs verstanden. Der Aufrufer programmiert:
Java:
List meineFreunde=getFriends(new LinkedList()); // oder eben new ArrayList();
Habe eben auf dem Schlauch gestanden. Tolle Idee!!!

Danke an alle, die Frage ist geklärt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
C Klassenhirarchien zur Implementierung von Fahrzegen Java Basics - Anfänger-Themen 26
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
D Datentypen Implementierung eines Binärbaumes Java Basics - Anfänger-Themen 7
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
D Was tun gegen zu komplzierten Denken beim Programmieren Java Basics - Anfänger-Themen 27
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
G gegen (etwas) programmieren Java Basics - Anfänger-Themen 11
C Reference - wird gegen meinen Willen - auf null gesetzt Java Basics - Anfänger-Themen 2
-horn- Strategie: Speichervorgang gegen unvollständiges Speichern absichern? Java Basics - Anfänger-Themen 11
O Neuen Blackberry 8800 oder Curve gegen kleines Programm Java Basics - Anfänger-Themen 9
A Programmieren gegen Interfaces Java Basics - Anfänger-Themen 4
L Was kann ich gegen "CMitarbeiterBeispiel has no main me Java Basics - Anfänger-Themen 5
F gegen interfaces programmieren Java Basics - Anfänger-Themen 6
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Wozu dient Interfaces? Java Basics - Anfänger-Themen 6
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben