Wie erstellen Sie IM OUT-oder OUT-Parameter in Java
In PL/SQL (oder vielen anderen Sprachen), kann ich IN-OUT oder OUT-Parameter, die aus einer Prozedur zurückgegeben. Wie kann ich erreichen, eine ähnliche Sache in Java?
Ich weiß, dieser trick:
public void method(String in, String[] inOut, String[] inOut2) {
inOut[0] = in;
}
Wo die in
parameter repräsentiert einen IN-parameter und die inOut
parameter einen Wert zurückgeben. Die Konvention wäre, dass String[] inOut
ist ein array von inOut.length == 1
.
Das ist irgendwie ungeschickt.
BEARBEITEN, Feedback zu Antworten: Andere tricks gehören:
- Halter/wrapper-Klassen, aber ich will nicht einführen, keine neuen Typen, callbacks, etc.
- Werte zurückgeben: ich hätte gerne ein Allgemeinen Lösung. I. e. eine mit mehreren IN-OUT-Parameter beteiligt.
- wrapper für die IN-OUT-parameter als Rückgabewert: Das ist ein gangbarer Weg, aber noch nicht so schön, da die wrapper-würde generiert werden irgendwie
Weiß jemand einen besseren Weg, dies zu erreichen in der Regel? Der Grund ist ich brauche eine Allgemeine Lösung ist, weil ich möchte, zu generieren, Komfort-source-code von PL/SQL in ein Datenbank-schema.
- "Werte zurückgeben: ich hätte gerne eine Allgemeine Lösung. I. e. eine mit mehreren IN-OUT-Parameter zu engagieren", Siehe meine Antwort. Mehrere IN/OUT params? Rückgabe einer Objektinstanz mit Eigenschaften, die für jeden. Abgesehen von, dass, Nein, es gibt nichts besseres, als den array-trick.
- Als ich anfing Java zu lernen, nach vielen Jahren von C/C++ Entwicklung, ich suchte auch nach einem Weg, um pass-by-reference. Aber jetzt, Jahre danach, kann ich nicht mehr erinnern, das Letzte mal wollte ich das tun. Die array-trick ist weniger elegant als andere Ansätze, zitiert in diese Antworten und Kommentare.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Frage wäre: Warum nicht
method
zurück etwas? Eher als ein in - /out-argument?Aber vorausgesetzt, Sie absolut, positiv müssen haben ein in - /out-argument, das ist eine ganz andere Frage, dann die array-trick ist in Ordnung. Abwechselnd, es ist nicht weniger plump, aber der andere Weg ist zu gehen in ein Objekt, Referenz:
(Oder, natürlich, nur machen
value
öffentlichkeit.) Sehen? Ich sagte, es war nicht weniger ungeschickt.Aber ich würde noch einmal nachfragen: Können Sie nicht
method
etwas zurückgeben? Und wenn es zurückgeben muss mehrere Dinge, kann es nicht zurückgeben, wird eine Objektinstanz mit Eigenschaften, die für diese Dinge?Off-topic: Dies ist einer der Bereiche, wo ich wirklich wie die C# - Lösung. Eines der Argumente gegen in - /out-Argumente ist, dass Sie sich unklar an der Stelle, wo du bist aufrufen die Funktion. Also C# macht man ihm klar, indem das Schlüsselwort-sowohl in der Deklaration der Funktion und, wenn Sie ihn aufrufen. In der Abwesenheit, die Art der syntaktischen helfen, ich möchte vermeiden, "Simulation" in/out-Argumente.
Java kopiert alles, was Sie übergeben als argument. Wenn Sie eine primitive, innen Methode Sie haben die Kopie, die primitiven, und keine Modifikationen Einfluss auf die eigentliche variable außerhalb der Methode. Wenn Sie das Objekt übergeben, übergeben Sie die Kopie der Referenz, die eigentlich Referenzen auf das ursprüngliche Objekt. Dies ist die Art und Weise, wie Sie die Weitergabe der änderungen an den Kontext von etwas, das die Methode aufgerufen hat, - durch ändern der Zustand des Objekts, das den Verweis ist die "änderung" zu. Siehe mehr dazu: Hat Java Pass by Value oder by Reference?
void foo(MyObject m)
) sind genaue Entsprechungen von C/C++ Zeiger (void foo(MyObject *pm)
). Sie können zuweisenm
(Java), odermp
(C/C++), aber das hat keine Auswirkungen auf irgendetwas außerhalbfoo
. Aber C/C++ Zeiger Zeiger:void foo(MyObject **ppm)
, wo die Wirkung des Schreibens zu*ppm
können gesehen werden, in der aufrufenden Methode. Java ist analog der array-trick der OP gekennzeichnet.void foo(MyObject ***pppm)
. 🙂Gibt es keinen direkten Weg. Andere Technik gehören:
Wenn Sie darüber nachdenken, den array-trick nicht unähnlich ist für die übergabe von T* in C/C++