Methoden Methoden mit mehreren Rückgabewerten

Crian

Top Contributor
Anders als in anderen Sprachen kann man in Java leider nur einen Wert zurückgeben. Mir geht es hier um eine grundsätzliche Auseinandersetzung mit diesem Problem, ohne ein konkretes Problem zu haben.

Wenn man nun mehrere Rückgabewerte braucht, gibt es folgende Möglichkeiten, die ich sehe:

1) Mehrfachabarbeitung des Methodeninhalts, jedes mal wird ein anderer der benötigten Werte zurückgegeben

Nachteile:
- Codeduplizierung
- Laufzeiteinbußen
- Nicht immer ist der Inhalt der Methode mehrfach anwendbar, ohne das Ergebnis zu verfälschen

Fazit: Nicht sinnvoll einsetzbar.

2) Auslagern der Methode in eine eigene Klasse, das Klassenobjekt kann nach der Ausführung nach den unterschiedlichen Ergebnissen befragt werden.

Nachteile:
- U.U. müssen der Klasse zur Ausführung der Methode viele, viele Daten übergeben werden, die eigentlich in der ursprünglichen Klasse vorgehalten werden.
- Zusammengehöriges wird u.U. auseinander gerissen (gehört die Methode thematisch eher nicht zur Klasse, in der sie sich im Moment befindet, ist das hingegen ein gangbarer und vielleicht sinnvoller Weg).

Fazit: Nur sinnvoll, wenn man thematisch nicht zusammengehöriges damit entheddert.

3) Bilden einer Liste der Rückgabewerte.

Nachteile:
- Die Information welcher Wert an welcher Stelle steht ist entweder mit benannten Konstanten zu belegen oder die Indices stehen hart kodiert im Code.
- Die Lesbarkeit und Wartbarkeit des Codes leidet.
- Bei Rückgabewerten mit unterschiedlichen Typen müsste man eine List<Object> nehmen und nicht nur die Indices ständen überraschend da, auch "wilde" Casts.

Fazit: Eigentlich eher hässlich.

4) Bilden eines ziemlich leeren Objekts (ich glaube sowas nennt man auch Bean), das nur die Rückgabewerte enthält und sich nach diesen befragen lässt. und Übergabe dieses Objekts.

Nachteile:
- Eine eigentlich ziemlich nutzlose Klasse wird nur zur Rückgabe der Werte gebraucht.
- Der Code wird dadurch auch nicht gerade übersichtlicher, falls sowas öfter vorkommt.


Ich habe bisher Methode 4 verwendet, etwa um ein Matching-Result zurückzugeben. Freundlicher Weise ist in dem Fall die "kleine, nutzlose" Klasse schon eingebaut und man muss sie nicht selbst anlegen.

Wie geht ihr hierbei vor? Gibt es einen weitere Weg? Welcher ist der Java-Königsweg?
 
Zuletzt bearbeitet:
ohne jetzt alles von dir gelesen zu haben, würde ich darauf einfach mal antworten, dass mehrere returns irgendwie ja mit einander im zusammenhang stehen. also würde ich diese einfach in einer klasse abbilden und ein objekt dieser klasse zurückgeben
 
wie sähe denn die Wuschlösung aus, wie ist es in anderen Sprachen besser gelöst?

4)
mit Generics kann die Anzahl der Klassen einsparen, braucht evtl. nur eine pro Anzahl Parameter,
mehrere solcher Klassen sind schnell kopiert, all diese Klassen können in einer Datei irgendwo im util-Package versteckt werden,
evtl. zusammen mit weiteren uninteressanten halb-automatisch erzeugten Arbeitsklassen,
durch die Klassendefinitionen muss der normale Code also nicht gestört werden falls man nicht explizit einzelne möchte

wenn in anderen Sprachen alles über Syntax gelöst ist, die man lernen müsste,
kann man das als Ausrede nehmen die Klasse möglichst kurz zu benennen und z.B. direkt mit Attributen statt über getter zu arbeiten

sieht dann vielleicht so aus:
Java:
import util.T;

public class Test {

    public static void main(String[] args)  {
        T2<String, Integer> e = findXy();
        String k = e.v1;
        Integer x = e.v2;
    }

    public static T2<String, Integer> findXy()  {
        String k = ..;
        Integer x = ..;
        return T2.c(k, x);
    }
}
 
Bei mir ist es von Mal zu Mal unterschiedlich. Wenn ich einen Pfad errechne, gebe ich endweder eine List mit Point-Instanzen zurück (wenns sehr simple ist) oder eine eigene Path-Klasse. Wenn ich eine Spalte einer Datenbank zurückgebe eine List oder ein Array. Bei 2D ein 2D-Array, wenn es sich um den selben Typ handelt, sonst eine List/Array einer eigenen Klasse. Sich auf einen "Königsweg" festzulegen nimmt einen imho die Flexiblität, die man bei unterschiedlichen Lösungen braucht.

(Oder wie zufällig gerade in HMWDH läuft: "Wir dürfen nicht jedesmal aufs neue so handeln, wie wir es immer schon getan haben, sonst bleiben wir stecken im Sumpf der Gewohnheit.")
 
Danke, die Idee mit den Generics und die Hilfsklassen in ein eigenes Paket zu verfrachten gefällt mir.
Und sicher sollte man sich nicht auf einen Weg versteifen. Es hätte ja nur sein können, dass es noch einen ganz anderen Weg gibt, der mir nicht in den Sinn kam.
 
wie sähe denn die Wuschlösung aus, wie ist es in anderen Sprachen besser gelöst?
Ruby:
Code:
def find_xy
   return x, y
end

def main
  x, y = find_xy
end

Mit Java loes ich sowas meistens mit ner Mini-Klasse mit public Feldern, die meistens auch ne Innerclass ist:
Java:
public class ReturnValue {
   public int x;
   public int y;
}
 
Ok, das ist tatsächlich noch eine weitere Möglichkeit. Wobei ich da wohl eine Klasse mit privaten Variablen, einem Konstruktor und Gettern vorziehen würde. Aber das kann man ja mal im Hinterkopf behalten.
 
Anders als in anderen Sprachen kann man in Java leider nur einen Wert zurückgeben.

In welcher Sprache ist das denn möglich? Und wie?

Wie haben recrods verwendet - heute verwendet man halt Objekte, aber das wurde ja schon gesagt.
Das ist faktisch auch nicht viel anders als ein Record - eine geeignete Datenstruktur die alle Werte beeinhaltet.
 
... das kommt davon wenn man viel zu langsam tippt ;-) mea culpa.
(Seltsam ist nur, dass ich trotz weitreichender Ausbildungen Ruby noch nie begegnet bin - muss etwas eher exotisches sein -> 1)

und zur Datenhaltungsklasse: Da ist es fraglich ob ein Konstruktor, sowie getter und setter sinnvoll sind. Das ist so etwa das Einzige Beispiel, bei dem unter gewissen Voraussetzungen darauf verzichte und direkt auf die Member zugreife. -> 2

--
Moooomentchen bevor ich jetzt gelyncht werde:
1 - exotisch muss nicht == schlecht heissen
2 - ich habe betont: unter gewissen Bedingungen
😀
 
Ruby kann ich zwar nicht, aber ich kenne es. Ich bezog mich da auf Perl, wobei das wohl in beiden Fällen eher eine elegante Weise ist, die Rückgabewerte wieder aus der Liste herauszuholen. Ist vermutlich nur Syntax.
 

Neue Themen


Zurück
Oben