Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern?

berserkerdq2

Bekanntes Mitglied
Hi, ich habe eine Methode, dessen Rückgabewert List ist, ich verwende in der Methode jedoch eine ArrayList und die gebe ich zurück und das klappt auch mit Rückgabewert List. Mein Problem ist nur, dass ich nun extern den Rückgabewert nur in List und nicht in ArrayList speichern kann, ist das schlimm? Soll ich einfach List verwenden, also macht das einen Unterschied oder kann man irgendwie die List in Arraylist speichern?
 

KonradN

Super-Moderator
Mitarbeiter
Hi, ich habe eine Methode, dessen Rückgabewert List ist, ich verwende in der Methode jedoch eine ArrayList und die gebe ich zurück und das klappt auch mit Rückgabewert List. Mein Problem ist nur, dass ich nun extern den Rückgabewert nur in List und nicht in ArrayList speichern kann, ist das schlimm? Soll ich einfach List verwenden, also macht das einen Unterschied oder kann man irgendwie die List in Arraylist speichern?
Das ist das richtige Vorgehen. Du solltest überall, wo es möglich ist, direkt mit den Interfaces arbeiten und nicht mit konkreten Klassen! Daher sollte eigentlich an (fast) allen stellen nur mit List gearbeitet werden.

Das ist ein wichtiges Prinzip von Clean Code. Du musst Dir nur vorstellen, was es bedeutet, wenn Du statt einer ArrayList plötzlich eine andere List nutzen willst. Du kannst dann alles ändern. Oder was, wenn Du nun zwei Codeteile hast und die arbeiten mit unterschiedlichen Implementationen von List? Dann müsstest Du hin und her Konvertieren?

Also daher: So wie Du es gemacht hast überall Interfaces verwenden. Nur da, wo es nicht vermeidbar ist (z.B. bei der Erstellung) die Klasse nutzen.
 
G

Gelöschtes Mitglied 65838

Gast
wenn du unbedingt die arraylist eigenschaften in der anderen klasse brrauchst, dann gib statt der Liste einfach die arraylist zurück
 

berserkerdq2

Bekanntes Mitglied
Das ist das richtige Vorgehen. Du solltest überall, wo es möglich ist, direkt mit den Interfaces arbeiten und nicht mit konkreten Klassen! Daher sollte eigentlich an (fast) allen stellen nur mit List gearbeitet werden.

Das ist ein wichtiges Prinzip von Clean Code. Du musst Dir nur vorstellen, was es bedeutet, wenn Du statt einer ArrayList plötzlich eine andere List nutzen willst. Du kannst dann alles ändern. Oder was, wenn Du nun zwei Codeteile hast und die arbeiten mit unterschiedlichen Implementationen von List? Dann müsstest Du hin und her Konvertieren?

Also daher: So wie Du es gemacht hast überall Interfaces verwenden. Nur da, wo es nicht vermeidbar ist (z.B. bei der Erstellung) die Klasse nutzen.
Okay dnake, aber kann ich List nutzen? Also Elemente auslesen etc?
 
G

Gelöschtes Mitglied 65838

Gast
probleme hast du erst wenn du eine methode brauchst die zb nur die arraylist kann und im list interface nicht festgelegt wurden... ab da musst du entweder casten oder gleich die arraylist zurück geben
 

KonradN

Super-Moderator
Mitarbeiter
das casten wäre die schlechtest möglcihe lösung nur so nebenbei erwähnt
Daher hätte ich dies auch nicht erwähnt. Man kann hhie rja - da ein konkreter Fall gegeben ist - genau schauen, was denn ArrayList mehr bietet als List. Und das ist nicht viel. ensuceCapacity gäbe es da z.B. aber das geht halt direkt auf interne Implementationsdetails die eben eigentlich uninteressant sein sollten.

Es geht statt dessen immer den Weg der Interfaces: man überlegt sich, was man überhaupt machen will. Was braucht man?

Braucht man wirklich eine Liste? Oder reicht schon eine Collection? Oder ggf. sogar ein Iterable? Und das entsprechende setze ich dann voraus.

Ein java.util.ArrayList voraus zu setzen bringt einem schnell Probleme - so es nicht rein intern ist. So gibt es auch noch mindestens eine weitere ArrayList, welche eine interne Klasse einer anderen Klasse ist (ich weiss jetzt nicht mehr genau, wo das war. Arrays?). Aber es kann ja noch weitere Implementationen geben. Es ist einfach Quatsch, sich da festzulegen, denn es führt früher oder später zu Folgeproblemen.
 
G

Gelöschtes Mitglied 65838

Gast
wenn jemand gerade lernt wie das mit Interfaces und klassen funktioniert sollte man vllt nicht gleich allles an den kopf werfen

zb. ich bezweifle ( kann mich auch irren ) dass der TE überhaupt weis wie man COllection oder Iterable hernimmt oder überhaupt weis was es alles an datenstrukturen gibt...
 

KonradN

Super-Moderator
Mitarbeiter
wenn jemand gerade lernt wie das mit Interfaces und klassen funktioniert sollte man vllt nicht gleich allles an den kopf werfen

zb. ich bezweifle ( kann mich auch irren ) dass der TE überhaupt weis wie man COllection oder Iterable hernimmt oder überhaupt weis was es alles an datenstrukturen gibt...
Daher gab es von mir auch nur eine einfach gehaltene Antwort an den TE - die Verkomplizierung ging von Anderen aus.

ich weiss jetzt nicht mehr genau, wo das war. Arrays?
Und ja - java.util.Array$ArrayList war es - ein Blick in den Source zeigt dies direkt auf:
http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/classes/java/util/Arrays.java - Zeile 3806.
 
G

Gelöschtes Mitglied 65838

Gast
und wo hab ich verkomplexisiiert ? dass man das original objekt zurück gibt anstatt das interface ? dass man casten KÖNNTE aber es eine schlechte lösung wäre ?wo ist es komplex
 

Neumi5694

Top Contributor
Ich hab's mir zur Angewohnheit gemacht, Eingangsparameter möglichst breitgefächert zu akzeptieren, also Interfaces, Iterable usw. wie oben auch schon erwähnt.
Den Rückgabewert geb ich hingegen so genau wie möglich an. Falls einem für die Weiterverarbeitung das Interface reicht, kann man ja für die Aufnahme des Rückgabewerts eine entsprechende Variable deklarieren.

Das hat vor allem den Sinn, dass in einer "List" so ziemlich alles drin sein kann, von EmptyList, UnmodifiableList bis zum Ergebnis von Arrays.asList oder subList. Wird hingegen eine ArrayList geliefert, so weiß man, dass man darauf nicht Rücksicht nehmen muss und mit der Liste direkt weiterarbeiten kann.
Interessant wird's noch, wenn man verschiedene Arten von SortedSets oder Maps verwendet, sowie EnumSet und EnumMap.

Hier scheiden sich wohl die Geister.
 

KonradN

Super-Moderator
Mitarbeiter
Den Rückgabewert geb ich hingegen so genau wie möglich an. Falls einem für die Weiterverarbeitung das Interface reicht, kann man ja für die Aufnahme des Rückgabewerts eine entsprechende Variable deklarieren.
Ja und nein. Damit brichst Du in vielen Fällen schlicht die Kapselung und gibst ein Implementationsdetail preis.
Du kannst ja nur rein praktisch überlegen, was das bedeutet: Dein Interface ändert sich, wenn Du intern etwas umstellst.

Aber die Kernaussage ist richtig: Wenn Du eine Liste zurück gibst, dann gibst Du eine Liste zurück -> List. Da musst Du also nicht überlegen, ob evtl. eine Collection oder Iterable ausreichen würde (Du kennst die Verwendung ja nicht!). Bei einem Parameter kennst Du die Verwendung aber. Und da macht es dann Sinn, sich genau zu überlegen, was man dann braucht. Und wenn Du nur ein Iterable brauchst, dann nimmst Du keine List als Parameter.

Mit eigenen Klassen läuft es aber meist genau auf dies hinaus. Denn Du hast zu Deiner Klasse Dog oft schlich kein DogInterface sondern nur lauter Interfaces wie BarkAble, BiteAble, FeedAble, ... Aber sobald Du so ein Interface hättest, dann würdest Du es verwenden. Wäre sinnvoll, wenn es mehrere Implementation geben können sollte. Da kommt also schlicht YAGNI ins Spiel.

das ist wohl nicht das prolbem ,sondern dass es nicht besprochen wird
Fachliche Dinge werden doch besprochen. Irgendwie fühle ich mich gerade leicht verarscht. Nur weil ich meine Sichtweise auf diesen Thread bzgl. "wer aus meiner Sicht was wie verkompliziert hat" nicht diskutiere (weil schlicht ohne fachlichen Bezug) habe ich doch erst relativ viel Zeit aufgewendet, DIR gewisse Dinge zu erläutern (Natürlich nur aus meiner Sicht. Jeder darf seine eigene Sicht haben. Aber ich hoffe, ich konnte immer alles etwas begründen). Und dann kommt so eine Aussage?
 

Neumi5694

Top Contributor
Ja und nein. Damit brichst Du in vielen Fällen schlicht die Kapselung und gibst ein Implementationsdetail preis.
Du kannst ja nur rein praktisch überlegen, was das bedeutet: Dein Interface ändert sich, wenn Du intern etwas umstellst.

Aber die Kernaussage ist richtig: Wenn Du eine Liste zurück gibst, dann gibst Du eine Liste zurück -> List. Da musst Du also nicht überlegen, ob evtl. eine Collection oder Iterable ausreichen würde (Du kennst die Verwendung ja nicht!). Bei einem Parameter kennst Du die Verwendung aber. Und da macht es dann Sinn, sich genau zu überlegen, was man dann braucht. Und wenn Du nur ein Iterable brauchst, dann nimmst Du keine List als Parameter.

Mit eigenen Klassen läuft es aber meist genau auf dies hinaus. Denn Du hast zu Deiner Klasse Dog oft schlich kein DogInterface sondern nur lauter Interfaces wie BarkAble, BiteAble, FeedAble, ... Aber sobald Du so ein Interface hättest, dann würdest Du es verwenden. Wäre sinnvoll, wenn es mehrere Implementation geben können sollte. Da kommt also schlicht YAGNI ins Spiel.
Nein, ich gebe preis, welches Format das Ergebnis hat, nichts weiter.
Ich kann innen ja auch new ArrayList<>(irgendwas) als Ergebnis liefern, der Aufrufende hat keine Ahnung, was innen abläuft. Nur kann er sich bei einer ArrayList sicher sein, dass er sie danach direkt verändern kann, was er bei einer List nicht sein kann.

Es ergibt sogar Sinn, sich zu überlegen, was man mit den Parametern anstellt. Und genau deshalb halt ich die Parameter so allgemein wie möglich und die Rückgabe so spezifisch wie möglich. Eine allgemeine Methode kann auch spezifische Parameter aufnehmen, aber nicht umgekehrt. An der Stelle fängt dann das Gecaste und/oder Umwandeln an, das ich tunlichst vermeiden möchte.
 

LimDul

Top Contributor
Dem möchte ich widersprechen. Auch die Rückgabe sollte so generisch wie möglich sein, ansonsten leakt man Implementierungsdetails (und gar inner-Classes) nach außen. Wenn für den Aufrufer solche Details wichtig sind, ist das keine saubere API. Ein Aufrufer sollte eigentlich nur dafür Interessieren, welches "Verhalten" eine Rückgabe nach außen exportiert und nicht wie das Verhalten implementiert ist. Das heißt im Best-Case - wenn vorhanden - ein Interface.

Ich gestehe aber zu, dass es bei List problematisch sein kann, weil man darüber nicht so einfach Dinge spezifieren kann wie Modifiable / Unmodifiable, weil leider die Collection-Interfaces schlecht designed sind.

Aber wenn man sich - egal welche - größere Bibliothek anschaut, wird trotzdem immer List und so gut wie nie eine konkrete Implementierung nach außen gegeben.
 

KonradN

Super-Moderator
Mitarbeiter
Ich kann innen ja auch new ArrayList<>(irgendwas) als Ergebnis liefern, der Aufrufende hat keine Ahnung, was innen abläuft. Nur kann er sich bei einer ArrayList sicher sein, dass er sie danach direkt verändern kann, was er bei einer List nicht sein kann.
Und selbst dann bist Du einmal festgelegt auf genau diesen konkreten Typ und damit ist Deine Implementierung, was die Flexibilität der Implementation angeht, limitiert.

Und wenn Du einmal in Dich gehst: Oft genug hast Du da dann etwas wie

Java:
ArrayList<..> getChildren() {
    return children;
}

Und dann hast du hier ein konkretes Implementierungsdetail.

Es ist nun einmal ein einfacher Punkt der Abstraktion - was bei objektorienter Entwicklung nun einmal eine wichtige Grundlage ist.
 

Neumi5694

Top Contributor
Und dann hast du hier ein konkretes Implementierungsdetail.

Nur wenn du den Quelltext kennst (und dann kennst du die Implementierung ja eh). Könnte ja auch das hier sein:
Java:
ArrayList<..> getChildren() {
    return new ArrayList<>(children);
}
children kann dabei jede Art von Collection sein.


Aber bleiben wir mal bei der "Flexibilität der Implementierung".
Welchen Vorteil hätte man denn hierdurch?
Java:
Collection<..> getChildren() {
    return children;
}
 

KonradN

Super-Moderator
Mitarbeiter
Welchen Vorteil hätte man denn hierdurch?
Du kannst es beliebig ändern. Es spielt keine Rolle, was Du da zurück gibst - so lange es eine Collection ist!

Erstes Beispiel von Dir:
children kann dabei jede Art von Collection sein.
Ja, aber du musst es durch einen Konstruktor jagen. Und zwar genau diesen Konstruktor (oder einen Code, der eben eine ArrayList zurück gibt).
==> Dieses Detail ist und bleibt somit vorgegeben!
==> Dadurch ist das, was zugrunde liegt, nicht mehr änderbar. Also dieses typische "getChildren().add(...)" (was ich für eine Unart halte, aber das ist erst einmal egal).

Wenn es nur Collection oder List ist, dann kann da auch ein List.of(...) sein, was eine List$ListN oder List$List12 zurück gibt. Oder eine Methode, die keine ArrayList sondern z.B. eine Arrays$ArrayList zurück gibt oder oder oder ...

Du limitierst Dich, was die Rückgabe angeht. Und das ist eines der generellen Kernthemen bei der Objektorientierung und den SOLID Principles und und und ... das findet sich eigentlich an vielen Stellen. Auch im Patterns Buch, auf das hier immer wieder verwiesen wird im Forum, wird dies angesprochen ("Head First Design Patterns" bzw. "Entwurfsmuster von Kopf bis Fuß").

Klar kannst Du es so machen. Aber es macht einfach keinen Sinn. Selbst innerhalb der Klasse wirst du ja vermutlich/hoffentlich auch eher etwas haben wie:
private List<Node> children;
und damit selbst da auf eine konkrete Klasse verzichten.

Also ich will Dir da nichts vorgeben! Du kannst da so verfahren, wie Du es für richtig hältst. Alles, was ich machen kann und will ist meine Sicht vorstellen und Gründe nennen, wieso ich so verfahre.

Vielleicht hilft auch eine andere Sichtweise: Ich will bei einer Methode bestimmte Informationen zurück geben. Das kann dann sein, dass ich eine Liste von Elementen zurück geben will. Das ist dann also eine Menge von Elementen eines bestimmten Typs in einer bestimmten Reihenfolge.
Was für wichtige Informationen liefert die ArrayList gegenüber der List, die an der Stelle relevant sind?
Klar: Wenn es relevante Informationen gibt, die ich bei der Rückgabe einer List verlieren würde, dann wäre hier tatsächlich eine ArrayList richtig und eine List falsch. Diese Frage musst Du aber beantworten können bei der Auswahl des Rückgabetyps.
 

Neumi5694

Top Contributor
Ich denke, ein Kernthema ist, dass man beim Aufruf einer Methode nicht limitiert ist und weniger darin, was jene Methode nach außen weitergibt. Als Aufrufender möchte ich schon wissen, was ich kriege. Blackboxes kommen ja nicht in "einem" Format, sondern in einem spezifischen. Wie die Daten generiert werden, interessiert mich nicht, aber das Format muss passen.

Als Entwickler der aufgerufenen Klasse weiß ich, was bei der Berechnung rauskommt, der Rückgabewert wird ja in der Methode erstellt. Der Header kann entsprechend definiert werden oder ein Interface liefern, das ändert an der Berechnung nichts. Ich kann innen drin, auch 3 Kilometer Spaghetticode stehen haben, den Aufrufenden interessiert das nicht.
Wäre die Freiheit der Implementierung anhand von Rückgabetypen eingeschränkt, so würden wir Number anstatt Integer,Float oder Double als Rückgabewerte liefern und den Aufrufenden damit klarkommen lassen.

Wichtig ist meiner Meinung nach in der objektorientierten Programmierung, dass ich als Aufrufender von außen nicht limitiert werde.

Auf deine Frage im letzten Absatz. Für den Programmier der aufgerufenen Methode ändert sich nichts.
Für den Aufrufer ändert sich sehr wohl was. Wenn er weiß, welche Collection ankommt, dann kann er anders darauf reagieren. Wie ich mittlerweile schon des öfteren erwähnt habe, könnte er bei einer List nicht wissen, ob er Elemente ersetzen/hinzufgen/löschen kann. Wenn er aber den Typ kennt, weiß er das.

Wie gesagt, da scheiden sich die Geister :)
 

KonradN

Super-Moderator
Mitarbeiter
dass ich als Aufrufender von außen nicht limitiert werde.
Und genau das findet halt statt. Da Du etwas überspezifiziert hast, bist du nun limitiert.

Als Versandhändler wirst Du auch nicht vorgeben, wie ein Produkt genau versendet wird. Das Produkt muss geliefert werden, ordentlich verpackt. Aber die genaue Größe des Pakets wirst Du nicht spezifizieren und damit bist Du beim Versand frei in der Verpackung.

Aber egal - Du darfst das gerne so weiter sehen.
 

Neumi5694

Top Contributor
Und genau das findet halt statt. Da Du etwas überspezifiziert hast, bist du nun limitiert.
Inwiefern?

Ich bin nicht Versandhändler, sondern Kunde. Wenn der Versender sagt, ich liefer dir ein 60x60x30 Paket, dann weiß ich als Empfänger, dass ich ein Paket krieg und ich weiß, dass es 60x60x30 groß ist, kann mich gegebenenfalls darauf vorbereiten. Wenn der Versender mir allerdings nur ein Paket schickt, könnte ich beim Empfang Probleme kriegen, wenn ich keinen Platz zum Hinstellen hab. Dann muss ich es erst mal abmessen und einen geeigneten Platz dafür finden. Bin ich dadurch weniger limitiert?

Angenommen, es kommt ein Point2D.Double als Ergebnis (und das ändert sich auch nicht, die API ist definiert). Inwiefern limitiert mich das?Ich kann ihn als Point2D verwenden oder als Point2D.Double
Wenn ein Point2D als Ergebnis kommt, hab ich hingegen nur eine Möglichkeit, bzw. muss dann erst mal prüfen, welche Klasse er hat, wenn ich was bestimmtes will. Ehrlich gesagt seh ich mich bei der Variante doch mehr limitiert als bei der ersten.

Wo genau ist meine Limitierung, wenn ich mehr Informationen habe? Wenn ich die nicht brauche, ignorier ich sie einfach.

Das kannst du natürlich ebenfalls gerne so sehen, wie du magst.

ps: Auch als Versandhändler muss ich wissen, wie groß die Artikel sind, sonst passiert's, dass eine Sammelmünze in einem Ikea-Umzugskarton verschickt wird, man weiß ja vorher nicht, was verschickt werden sollte und hat einfach mal "einen" Karton für die Aufnahme vorbereitet, vorsichtshalber den größten, den ich finden konnte.
 

KonradN

Super-Moderator
Mitarbeiter
Sorry, wenn due die Methode schreibst / die Rückgabe festlegst, dann bist Du nicht "Kunde" sondern natürlich "Versandhändler".
Aus meiner Sicht verdrehst Du das komplett.

Ansonsten einfach: Entwurfsmuster von Kopf bis Fuß, erstes Kapitel, OO-Prinzip: "Programmieren sie auf eine Schnittstelle nicht auf eine Implementierung".
Unabhängig ob Du "Versandhändler" oder "Kunde" bist: Das sollten beide wollen.
 

Neumi5694

Top Contributor
Sorry, wenn due die Methode schreibst / die Rückgabe festlegst, dann bist Du nicht "Kunde" sondern natürlich "Versandhändler".
Aus meiner Sicht verdrehst Du das komplett.

Ansonsten einfach: Entwurfsmuster von Kopf bis Fuß, erstes Kapitel, OO-Prinzip: "Programmieren sie auf eine Schnittstelle nicht auf eine Implementierung".
Unabhängig ob Du "Versandhändler" oder "Kunde" bist: Das sollten beide wollen.
Um genau zu sein bist du der, der verdreht. Oder interpretierst du den von dir zitierten Text "dass ich als Aufrufender von außen nicht limitiert werde." tatsächlich so, dass damit der Programmier der aufgerufenen Methode gemeint ist? Das glaube ich nicht, sorry. Tschö, wir machen schon :)
 

KonradN

Super-Moderator
Mitarbeiter
Um genau zu sein bist du der, der verdreht. Oder interpretierst du den von dir zitierten Text "dass ich als Aufrufender von außen nicht limitiert werde." tatsächlich so, dass damit der Programmier der aufgerufenen Methode gemeint ist? Das glaube ich nicht, sorry. Tschö, wir machen schon :)
Noch einmal zum Fokus:

Es geht darum, dass eine Methode geschrieben werden soll. Also ein Entwickler / Programmierer sitzt da um soll diese Methode schreiben. Und da ist die Frage:
a) Was ist die genaue Anforderung?
b) Wie kann der Entwickler den Code so schreiben, dass die Methode, die er jetzt gerade schreibt, möglich gut geschrieben ist.

Und da muss dann dieser Entwickler entscheiden, was er z.B. als Rückgabetyp festlegt.
 

Neumi5694

Top Contributor
Noch einmal zum Fokus:
Da hättst du mal lieber einen anderen Text zitieren sollen, wenn du auf das Zitierte gar nicht eingehen willst. Man möchte fast meinen, dass du die kritisierten Texte gar nicht liest.

Nochmal:
"Ich denke, ein Kernthema ist, dass man beim Aufruf einer Methode nicht limitiert ist und weniger darin, was jene Methode nach außen weitergibt."
"[...]dass ich als Aufrufender von außen nicht limitiert werde."
Das ist es, was du zitiert hast und der Text davor steht im selben Post. Wenn es dir um was anderes geht, dann sag das auch. Aber du hast das hier kritisiert.

a)b) Als Entwickler schreibe ich so, dass die Methode möglichst gut nutzbar ist. Und der Nutzer hat - falls ein Interface als Rückgabewert geliefert wird - nicht den geringsten Vorteil.
Deshalb schreib ich eine Methode so:
Java:
Point2D.Double addVectors(Point2D v1, Point2D... otherVectors) {...}
Nimm alles an, liefere Details zu dem was rauskommt, um die bestmögliche Nutzungsmöglichkeit zu gewährleisten.
 

KonradN

Super-Moderator
Mitarbeiter
Als Entwickler schreibe ich so, dass die Methode möglichst gut nutzbar ist.
Nein, das ist falsch. Du erfüllst Anforderungen und nicht mehr!

YAGNI ansehen! Das wäre hier jetzt ein Schlüsselwort!

Aber ich bin raus und werde weder Dich noch Jorek weiter igendwie überzeugen wollen. Argumente sind genannt, Quellen zum nachlesen auch. Macht daraus, was ihr wollt.
 

Neumi5694

Top Contributor
Nein, das ist falsch. Du erfüllst Anforderungen und nicht mehr!

YAGNI ansehen! Das wäre hier jetzt ein Schlüsselwort!

Aber ich bin raus und werde weder Dich noch Jorek weiter igendwie überzeugen wollen. Argumente sind genannt, Quellen zum nachlesen auch. Macht daraus, was ihr wollt.
Die Grundanforderung eines jeden, der eine externe Library verwendet, ist, dass die angebotenen Methoden gut nutzbar sind.
Ok, machen wir. Tschüs
 

thecain

Top Contributor
@KonradN Ich bin hier auch nicht ganz bei dir. Für die Stabilität zu gewährleisten, macht es mMn auf jeden Fall Sinn eher ein Interface zurückzugeben, als eine konkrete Klasse. Dann würde ich aber auch zum spezfischsten Interface tendieren.

Ich hatte in einem Projekt eine Codebase, in der oft Collection<> zurückgegeben wurde, obwohl in der konkreten Implementation eine Liste verwendet wurde und ich auch auf die sortierung angewesen wärde. Die Optionen waren dann, nochmal "sortieren" bzw in eine Liste überführen oder die ganze Codebase ändern.

Siehe auch:
 

KonradN

Super-Moderator
Mitarbeiter
Das ist doch ein guter Ansatz. (Ändert aber nichts daran, dass da ein Entwickler das Framework schreibt und dass dieser einfach nur die Anforderungen umsetzt. Die Anforderungen sind nur etwas umfangreicher):

Also schau einfach einmal Libraries / Frameworks an. Spring, Quarkus, .... Welche Library soll es sein? Vielleicht bleiben wir auch einfach beim Java Framework? Was wird denn da so als Rückgabe verwendet?

@thecain Bitte jetzt in die letzten Posts nichts falsches hinein interpretieren! Hier geht es explizit um List vs ArrayList! Bei Rückgabetypen war schon klar, dass man da möglichst genau bleibt - bei den Interfaces! So dies möglich ist! Also wenn ich eine List habe, dann gebe ich diese auch zurück. Da würde ich ohne sehr guten Grund nie auf Collection oder Iterable zurück gehen! Das ist also komplett unbestritten und war in #17 so ja abgehakt:
Aber die Kernaussage ist richtig: Wenn Du eine Liste zurück gibst, dann gibst Du eine Liste zurück -> List. Da musst Du also nicht überlegen, ob evtl. eine Collection oder Iterable ausreichen würde (Du kennst die Verwendung ja nicht!). Bei einem Parameter kennst Du die Verwendung aber. Und da macht es dann Sinn, sich genau zu überlegen, was man dann braucht. Und wenn Du nur ein Iterable brauchst, dann nimmst Du keine List als Parameter.
 

KonradN

Super-Moderator
Mitarbeiter
@Neumi5694: Du gibt @thecain ein Like? Dir ist aber bewusst, dass er unter dem Strich nichts anderes schreibt als ich die ganze Zeit?

Für die Stabilität zu gewährleisten, macht es mMn auf jeden Fall Sinn eher ein Interface zurückzugeben, als eine konkrete Klasse.

Das Andere, was er schreibt, war in #17 schon längst abgenickt und war gar kein Thema mehr! Du hast nur eben immer auf die AraryList bestanden statt das Interface List zu nutzen ....
 

Neumi5694

Top Contributor
@Neumi5694: Du gibt @thecain ein Like? Dir ist aber bewusst, dass er unter dem Strich nichts anderes schreibt als ich die ganze Zeit?



Das Andere, was er schreibt, war in #17 schon längst abgenickt und war gar kein Thema mehr! Du hast nur eben immer auf die AraryList bestanden statt das Interface List zu nutzen ....
Gegenfrage: Wie oft willst du immer noch die beleidigte Leberwurst spielen, dich aus einem Thread verabschieden und dann doch weiterposten?

Sein erster Absatz befürwortet Interfaces, der Rest und vor allem der Link stimmen mit meinem Prinzip überein (also das genaue Gegenteil von dem, was du geschrieben hast). Und dafür den Like.
Edit: Außerdem war sein Post besser geschrieben als unsere, ohne die typische Rechthaberei.
 

KonradN

Super-Moderator
Mitarbeiter
Gegenfrage: Wie oft willst du immer noch die beleidigte Leberwurst spielen, dich aus einem Thread verabschieden und dann doch weiterposten?
Ja, es kommen halt doch immer wieder Punkte, wo ich meine, dass man da den Ansatz hätte, das Missverständnis aufzuzeigen.

Und ja - ich bin in keiner Weise konsequent. Das habe ich doch schon mit der Erstellung dieses Accounts bewiesen.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, wie wär's mit einer Friedenspfeife? (ernst gemeint)
Ich bin Dir in keiner Weise böse oder so. Du hast Deine Meinung und das ist ok. Ich habe versucht Argumente zu bringen, Dinge zu erläutern. Dann wollte ich es dabei sein lassen und dann lieferst Du einen erneuten Ansatz, wo man evtl. ansetzen könnte ... Wenn ich Dir böse wäre oder so, dann würde ich da ja nicht mehr Antworten. Dann wäre die Anzahl der Arschlöcher um 1 größer geworden und ich hätte nicht mehr geantwortet oder so ...

Du bist ja auch vernünftig und ich denke ja auch, dass Du guten sauberen Code schreiben willst. Und da will ich doch auch nur helfen mit Abwägungen und Erläuterungen. Ob ich da Recht habe oder nicht, ist dabei egal. Wenn ich nicht Recht habe, dann lerne ich etwas dazu - dann hätte der Thread mir auch was gebracht.

Aber wir drehen und scheinbar nur im Kreis bzw. ich kriege das (vermeintliche) Verständnisproblem nicht gepackt. Und dann sind wir plötzlich wieder 20 Posts zurück.

Und das nervt mich. Sowas kann ich derzeit nicht ab. Das werfe ich Dir oder Joreyk in keiner Weise vor. Nur eben bleibt der Fakt, dass es mich schlicht nervt. Und das ist es einfach nicht wert. Und daher dann auch schlicht das Ziehen von Konsequenzen...
 

KonradN

Super-Moderator
Mitarbeiter
@KonradN, wie war das nochmal mit der Liste? 🍿
Hmm... welche Liste meinst du, wenn du von DER Liste redest?

Meine Frau hat eine Einkaufsliste geschrieben. Willst du dazu mehr erfahren?

Also das Wichtige ist wohl: Bier ist auch auf der Liste ... Du kannst also vorbei kommen um dann ein warmes Bier aus einem Holzteller zu trinken (also ganz unfähig, neues zu lernen, bin ich dann doch noch nicht... :) )
 

mihe7

Top Contributor
Wobei jetzt die Frage wäre, heißt es dann
Java:
class Wife {
    List<?> getShoppingList() { ... }
    // oder
    ShoppingList getListOfItemsWhichYouHaveToBuyIfYouDontWantToGetInTrouble() { ... }
}
?
 
G

Gelöschtes Mitglied 65838

Gast
Wobei jetzt die Frage wäre, heißt es dann
Java:
class Wife {
    List<?> getShoppingList() { ... }
    // oder
    ShoppingList getListOfItemsWhichYouHaveToBuyIfYouDontWantToGetInTrouble() { ... }
}
?
damit würdest du aber frauen als objekte darstellen... ohoh... da werden probleme kommen :eek:
 

KonradN

Super-Moderator
Mitarbeiter
@mihe7 aber zum Thema positionieren willst Du Dich nicht? List oder ArrayList - was soll denn nun ein Entwickler zurück geben? Dein warmes Bier musst Du Dir schon noch verdienen!
 

mihe7

Top Contributor
Ich verfahre nach dem Grundsatz "so abstrakt wie möglich, so konkret wie nötig/sinnvoll", heißt in der Regel, dass ich List zurückgebe.

Damit habe ich auch kein Problem, warum auch? Die List definiert die Semantik und fertig. Einzig die Frage, ob modifiable oder nicht, bleibt beim Interface zur Übersetzungszeit ungeklärt. Das stellt sich mir aber nicht als großes Problem dar, denn die Einsatzmöglichkeiten ergeben sich sowieso nur aus dem Kontext (Methodennamen, Doku).

Würde ich umgekehrt z. B. ArrayList zurückgeben, habe ich einen Vertrag, der den Nutzern der Klasse eben genau dies zusichert. Will ich das ändern, habe ich ein Problem, wenn sich die Clients darauf verlassen haben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Wie gebe ich bei android eine string im programm aus? Java Basics - Anfänger-Themen 4
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
M Wie gebe ich true or false aus? Java Basics - Anfänger-Themen 9
D gebe string zurück mit von bis bestimmtes Zeichen Java Basics - Anfänger-Themen 4
GreenTeaYT Wie gebe ich Informationen von einer Klasse zur anderen Klasse? Java Basics - Anfänger-Themen 9
G Wie gebe ich einen Dateipfad in RandomAccessFile an? Java Basics - Anfänger-Themen 2
M Wie gebe ich den Inhalt aus? Java Basics - Anfänger-Themen 17
T gebe mir den ersten eltern knoten Java Basics - Anfänger-Themen 3
S Wie gebe ich den Source Code ohne Kommentare aus? Java Basics - Anfänger-Themen 4
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
G Wie wartet man bis ein URL eine Antwort zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
M mit Maven eine ausführbare Jar bauen Java Basics - Anfänger-Themen 7
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
S Eine Idee umsetzen ganz schnell!? Java Basics - Anfänger-Themen 68
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
jeff98 Wie kann man in Java eine Zeichenformation ausgeben? Java Basics - Anfänger-Themen 9
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
L Anpassung der Spaltenbreite auch auf eine zweite Tabelle anwenden Java Basics - Anfänger-Themen 8
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
U Warum gibt das eine Nullpointerexception? (Switch) Java Basics - Anfänger-Themen 6
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
M Wie lassen sich Objektkonstanten initialisieren, wenn sie eine Bedingung erreichen? Java Basics - Anfänger-Themen 6
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
M Wie richte ich eine Diagonale an Robotern in einer World ein? Java Basics - Anfänger-Themen 15
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Kann ich eine jar anschauen wie sie gecoded wurde? Java Basics - Anfänger-Themen 2
A Eine Textdatei auslesen Java Basics - Anfänger-Themen 16
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
N Variabel in eine class mit "extends JLabel" übertragen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
B eine methode erstellen Java Basics - Anfänger-Themen 7
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
E Warum lässt sich eine Klasse nicht starten, wenn eine andere Klasse in dem Modul fehlerhaft ist? Java Basics - Anfänger-Themen 1
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
O zweidimensionales array in eine csv-Datei Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben