HashSet und LinkedHashSet Instanzierung warum so?

Status
Nicht offen für weitere Antworten.

fsteinke

Mitglied
Hallo,

habe gerade ein super verständnisproblem beim nutzen von Set Collections.

Warum muss ich denn, zumindest sehe ich das hier nur, eine HashSet oder LinkedHashSet immer mit dem Set und nicht mit HashSet als Typ erzeugen?

Beispiel
Java:
Set<String> mset = new <String>HashSet();

Die Variante

Java:
HashSet<String> mset = new <String>HashSet();

funktioniert doch auch. Wo ist mein Denkfehler?

TreeSet wird doch auch
Java:
TreeSet<String> mset = new <String>TreeSet();
aufgerufen. ArrayList ja auch ?

Mir ist klar das das Interface Set implementiert ist und es geht also sozusagen ein Upper Cast aber warum ? Hab ich dann Nachteile?

Denke mal ich hab da was grundlegend nicht verstanden.


Danke für jeden Tip der mir Erleuchtung bringt.


Gruß Frederick
 
Zuletzt bearbeitet:
Ein allgemeines Interface ist weniger spezifisch, weil man die Implementierung vernachlässigen/austauschen kann.
Deswegen macht man meist
Java:
List<String> myList = new ArrayList<String>();
 
Man sollte möglichst immer Objecte anhand ihrer interfaces referenzieren statt der konkrete Implementation. Wenn du irgendwann z.b. aus Performancegründen auf eine andere Implementation des interfaces umsteigen willst, brauchst du nur die Stelle zu ändern wo das Object erzeugt wird. Der komplette restliche Code funktioniert weiterhin ohne Compile-Probleme.

Außerdem können Methoden, die z.b. ein Set als Paramete erwarten, viel häufiger benutzt werden, als z.b. Methoden die ein HashSet erwarten. Es ist "allgemeingültiger".
 
Das war ja schnell.

Kannst Du mir das noch etwas konkreter erläutern. Ist mir nicht ganz klar wie Du das meinst mit ***Implementierung vernachlässigen/austauschen***

Gruß Frederick
 
Danke für die schnelle Info.

Glaube hab das verstanden.

Wenn ich z.B.

Java:
Set<String> mset = new <String>HashSet();

verwende könnte ich wenn mir meinetwegen die Performance oder was auch immer nicht passt einfach

Java:
Set<String> mset = new <String>LinkedHashSet();

schreiben. Meine Referenzvar mset die ja eventuell im weiteren SOurce an unterschiedlichste Methoden etc. übergeben wird ist dahingehend allgemein, dass meine Parameter in der Methode einen Typ Set erwarten und nicht allzu konkret z.B. einen HashSet

z.B.

Java:
void methode1(List param1)

u. nicht

Java:
void methode1(HashList param1)

Die Funktionalität der Collection selbst ist durch die Schreibweisen von

Java:
Set<String> mset = new <String>LinkedHashSet();

oder
Java:
HashSet<String> mset = new <String>LinkedHashSet();

aber nicht eingeschränkt oder?


Ist das so richtig?


Gruß Frederick.
 
Ganz einfach: Wenn du von HashSet zu TreeSet oder irgendeinem anderen Set wechselst, deine Variable aber "nur" als Set definiert hast, bekommt der Rest des Programms von dem Wechsel nichts mit. Erwartet dein Programm dagegen überall "ganz konkret" ein HashSet, darfst du überall im Programm rumändern, um auf den neuen Typ zu wechseln.

Stell dir vor, in einem Laden müsstest du einen Scanner für EC-Karten installieren. Würdest du einen nehmen, der nur Commerzbank akzeptiert? Nö, das Ding sollte mit soviele Karten wie möglich arbeiten. Warum ist das so? Weil dir eigentlich völlig schnuppe ist, ob dein Kunde bei der Deutschen Bank oder bei der Sparkasse Bottrop ist, und genauso sollte es deinem restlichen Programm egal sein, was das nun "konkret" für ein Set ist.
 
Zuletzt bearbeitet:
Die Funktionalität der Collection selbst ist durch die Schreibweisen von
Java:
Set<String> mset = new <String>LinkedHashSet();
oder
Java:
HashSet<String> mset = new <String>LinkedHashSet();
aber nicht eingeschränkt oder?

Ist das so richtig?
Naja, du kannst halt auf die Variable mset NUR Methoden aufrufen die im Interface Set deklariert sind. Ansonsten machts von Programmablauf her keinerlei Unterschied, das Object ansich ist ja unabhängig davon wie es referenziert wird.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben