zurückgeben mehrerer Werte in Java
Präambel: ich bin mir bewusst, mit einer Liste oder in anderen Sammlungen, um ein Ergebnis zurückgeben, aber dann muss ich gehen Sie durch die Liste der Pflückung werden die Ergebnisse aus: siehe 2. Beispiel
Präambel-2: ich bin auf der Suche nach einer Antwort jenseits von "das ist in Java nicht unterstützt wird ..."
Ich bin auf der Suche nach einem bequemen Weg, mehrere Objekte von einer Java-Methode aufrufen.
Ähnlich wie in PHP:
list ($obj1, $obj2, ...) foobar();
Ich bin wirklich müde der übergabe von holder-Objekten in der Argumentation zum Beispiel:
class Holder {
int value;
}
Holder h1=new Holder();
Holder h2=new Holder();
dann:
o.foobar(h1,h2);
... würde mich sehr interessieren, wenn jemand dachte, ein eleganter Weg, um diese.
Mithilfe einer Liste
List<String> = foobar();
Gibt es zwei Nachteile zu diesem:
Habe ich zum ersten pack der Liste auf der aufgerufenen Seite des Hauses:
//this is on the callee side of the house
ArrayList<String> result = new ArrayList<String>
result.add("foo");
result.add("bar");
Dann auf der rufenden Seite muss ich zupfen Sie die Ergebnisse aus:
//This is on the caller side
List<String> result = foobar();
String result1 = result.get(0);
String result2 = result.get(1); //this is not as elegant as the PHP equivalent
Weiter sagen, ich wollte, um wieder Objekte von verschiedenen Typen, die sagen wie String, Integer, würde ich die zurückgeben einer Liste von Objekten, und dann warf jeder Gegenstand ... nicht schön
Dank.
- Ich würde einfach wieder eine Liste
- Was ist das problem mit der Rückgabe-Liste?
- Bearbeitet. Ein "Alter Hase" bei Java würde nicht diese Frage stellen, und das original kam über ein bisschen snarky.
- vielleicht und Älteren hand als man hätte 🙁 ... kindische Reaktion!!!
- Wenn es nicht unterstützt wird, wird es nicht unterstützt. So einfach ist das. Sie können arrays oder andere Sammlungen mit den bekannten Nachteilen - vor allem mit der ungünstigen boilerplate um eine Liste bis. Verwenden scala statt, und Sie bekommen Tupel. Sie können Tupel von Java -, natürlich, aber nicht in dieser eleganten Art und Weise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung eines generischen tuple-Klasse ist der nächste, den ich mir vorstellen kann. Um eine Vorstellung zu geben, wie general purpose-Klasse für drei Werte zurückgeben könnte in etwa so Aussehen:
Dies ermöglicht einen " one-statement-Konstruktor auf der aufgerufenen Seite, zum Beispiel:
aber keine Halterung Instanz Konstruktion der angerufene zu tun.
Jeder Anzahl der Rückgabewerte muss ein Tupel-in seiner eigenen Klasse. Es könnte sein, dass so etwas wie in der Funktionale Java-Bibliothek. Als Referenz, hier ist ein N-Tupel Umsetzung.
Für die beiden geschätzten Fall java.util.AbstractMap.SimpleEntry tun würde:
Jedenfalls sehe ich zwei wichtige Punkte zu berücksichtigen, für die mehrere Werte zurückgeben:
So langweilig wie es ist, würde ich empfehlen, eine separate Klasse zu halten alle die response-Werte und erklären, dass er als den Rückgabetyp der Methode. So wird die Bedeutung der einzelnen Werte können markiert werden.
Können Sie eine Methode, wie mit einer Signatur wie diese :
Können Sie wieder eine
List
,Set
, oderMap
?Rückkehr eine erweiterte Halterung scheint besser als Rückgabe einer Liste:
Wenn Sie zurückgeben müssen mehrere Werte des gleichen Typs, dann wird eine Liste oder ein Set ist angemessen. Es ist vollkommen gültig, um zurückzukehren, zum Beispiel, eine variable-length-username-Liste als eine Liste. Wenn Sie wissen, Sie sind immer wieder eine Feste Anzahl von Werten, würde ich ein array verwenden. Zum Beispiel, in einer Methode, die zurückgibt, eine Art von Benutzer-ID als drei verschiedene zahlen, die ich benutzen würde:
In der Aufrufer-code, den Erhalt der Werte ist so einfach wie
array[0]
,array[1]
undarray[2]
. Dies ist viel einfacher als eine Sammlung, und Sie werden nicht etwas zu brechen, da user-IDs definiert als drei Ganzzahlen.Wenn Sie wirklich brauchen, um wieder mehrere unterschiedliche Werte, dann ist der Halter Klasse ist die beste Möglichkeit, keinen anderen Weg herum. Mehrere Rückgabewerte werden in Java nicht unterstützt wird. Aber ich würde lieber Blick auf die Lösung aus der Sicht des design. Wenn eine Klasse zurückgeben muss, mehrere unterschiedliche Werte, dann ist es wahrscheinlich nicht sehr viele Dinge, einige davon unabhängig von anderen. Ein Stück code (eine Klasse, eine Methode) sollten immer mit einem einzigen klaren Ziel und klar definierten Verantwortlichkeiten. Eher, dass wieder mehrere unterschiedliche Werte, ich würde aufteilen der Methode in mehrere kürzere Methode oder definieren Sie eine Schnittstelle zu externalisieren alle Funktionen. Wenn diese return-Werte sind im Zusammenhang in irgendeiner Weise und würde nicht eine Bedeutung haben, wenn man Sie auseinander, dann denke ich, Sie verdienen es, eine Klasse auf eigene Faust.
Können Sie verwenden Sie eine der Sammlung Klasse für diesen Zweck. Diese Lektion kann Ihnen helfen bei der Entscheidung, was am besten für Sie geeignet.