Variable als Interface oder Implementierung deklarieren

Hallo allerseits

Ich habe eine Frage bezüglich der Variablendeklaration. Bisher bin ich davon ausgegangen das solche Konstrukte zu vermeiden sind.
ArrayList<T> badList = new ArrayList<T>() und man stattdessen lieber mit dem Interface arbeiten sollte, hier eben List.

Nun gab es gestern Diskussion wo jemand meinte das man bei reinen Klassenvariablen auch gerne die Implementierung nutzen sollte, da man ja sonst ewig rumcasten muss und man eh keinen Funktionaufruf macht.

Meiner Ansicht nach hat er damit recht sofern er seinen Code unflexibel halten will und darauf vertraut das die ArrayList Impl. nicht geändert wird oder die Methode rausfliegt. Wie sehen das die Experten hier?

Kann allg. vllt nochmal jemand erklären wann/wieso man eher das Interface nutzen sollte und wann nicht

Hallo,

man sollte immer die Deklarationen der höhreren Abstraktionsebene wählen.

Wenn ich Methoden der konkreten Klasse benötige ich davon abhängig bin, implementiere ich gegen die konkrete Klasse.

Das gleiche gilt auch für Parameter.

Gruß,

Martin

[QUOTE=Marcinek]Hallo,

man sollte immer die Deklarationen der höhreren Abstraktionsebene wählen.

Wenn ich Methoden der konkreten Klasse benötige ich davon abhängig bin, implementiere ich gegen die konkrete Klasse.

Das gleiche gilt auch für Parameter.

Gruß,

Martin[/QUOTE]sprich, sowas Java Code:
[LEFT]
[ol]
[li]public void macheWas(ArrayList list){}[/li][/ol]

[/LEFT]

ist vollkommen legitim und “guter” Stil sofern ich dann dort ArrayList spezifische Methoden brauche?

Sonst bleibt nur casten. Und das wäre imho richtig schlecht. Weil hier eben eine Arraylist notwendig ist.

Wenn die Methode oder Variable private ist, spricht nichts dagegen, die konkrete Klasse zu verwenden. Das ist dann nur ein Implementierungsdetail, das man beliebig ändern kann, ohne abhängigen Code zu beeinflussen. Anders sieht es aus, wenn es sich um die veröffentliche Schnittstelle der Klasse handelt (also alles außer private). Hier sollte man nur die Interfaces nehmen, es sei denn, es geht nicht anders (dann sollte man sich aber auch fragen, warum das so ist).

Ansonsten sollte man sich denken, warum man die Implementierung unbedingt braucht und ob die noetige Funktionalitaet nicht in die Abstraktion gehoert.

Ansonsten, wie gesagt, bei privaten Methoden ist es nicht so schlimm.

Also ich denke, dass hier die Listen einfach nur Stellvertretent für alle Implementierungen stehen.

Und wenn dem so ist, dann werden nunmal die konkreten Implementierungen gebraucht. Ist so.

Ich würde sagen so wenig gegen die Implementierungen wie möglich aber so viel wie nötig. Da irgendwelche Kunstgriffe zu tätigen um die paar Fälle auch noch zu abstrahieren. Nun da nimmt man lieber die Impl. Meistens gehts ja gegen die Abstrakte. Kam bei mir noch nicht wirklich oft vor (überhaupt?!) …

[QUOTE=bygones]Ansonsten sollte man sich denken, warum man die Implementierung unbedingt braucht und ob die noetige Funktionalitaet nicht in die Abstraktion gehoert.[/QUOTE]Ich denke auch, dass in diesem Fall ein Design-Fehler vor liegt, den man nicht mit einem Cast beheben sollte…

[QUOTE=bygones;28409]Ansonsten, wie gesagt, bei privaten Methoden ist es nicht so schlimm.[/QUOTE]Ich bin ja einfach zu faul zwischen öffentlichen und privaten Bereichen in meinem Code zu unterscheiden…:smiley:

bye
TT

[QUOTE=Unregistriert]sprich, sowas Java Code:
[LEFT]
[ol]
[li]public void macheWas(ArrayList list){}
[/li][/ol]

[/LEFT]

ist vollkommen legitim und “guter” Stil sofern ich dann dort ArrayList spezifische Methoden brauche?[/QUOTE]

Aber welche sollen das sein? Fast alle Methoden von ArrayList sind im List-Interface. (OK, ich sehe gerade, removeRange ist eine evtl. nützliche Methode, die nicht aus dem Interface stammt.)

Meiner Meinung nach gehen viele APIs nicht weit genug. Z.B. ist oft nicht einmal die Reihenfolge notwendig, da reicht Collection völlig.

Eigentlich ist es recht einfach: Man verwendet das allgemeinste, womit die Aufgabe erreicht werden kann. FÜr “ArrayList” gibt es praktisch nie einen Grund, wann braucht man schonmal die Methoden “trimToSize” und “ensureCapacity”?

Zu sagen: “Das ist private, da ist das OK” ist IMHO aber gefährlich. Diese Anforderung, z.B. eine ArrayList zu haben, die mit einer privaten Methode
private void doSomething(ArrayList list)
aufgestellt wird, “leakt” oft fast zwangsläufig in die public API

public void compute(List<T> list)
{
    doSomething(list); // Mist - braucht ArrayList - was tun?
    doMore(list);
    ...
}

Mist - braucht ArrayList - was tun?

Tja, dann ist dann wohl ein Refactoring angebracht.

Der Punkt ist, dass so eine Anforderung sich u.U. ziemlich schnell ziemlich weit durch mehrere Methoden und Klassen ziehen kann, und schon durch alltägliche Änderungen wie ein Collections.sychronizedList, list.sublist oder Arrays.asList kaputt gemacht werden kann, und … man sich das von vornherein sparen kann. Ist doch toll, wenn man weniger tippen muss um besseren Code zu erhalten :slight_smile: (Das letzte soll aber kein Grund sein, von ‚Collection‘ Abstand zu nehmen :D)

Alles klar. Danke für alle Antwortenden