So erstellen Sie IN OUT- oder OUT-Parameter in Java

8

In PL / SQL (oder vielen anderen Sprachen) kann ich IN OUT- oder OUT-Parameter haben, die von einer Prozedur zurückgegeben werden. Wie kann ich eine ähnliche Sache in Java erreichen?

Ich kenne diesen Trick:

%Vor%

Dabei steht der Parameter in für einen IN-Parameter und der Parameter inOut für einen Rückgabewert. Die Konvention wäre, dass String[] inOut ein Array von inOut.length == 1 ist.

Das ist irgendwie tollpatschig.

BEARBEITEN Feedback zu Antworten : Weitere Tricks:

  • Inhaber / Wrapper-Klassen, aber ich möchte keine neuen Typen, Rückrufe usw. einführen.
  • Rückgabewerte: Ich möchte eine allgemeine Lösung. I.e. eines mit mehreren IN OUT-Parametern.
  • Wrapper für IN OUT-Parameter als Rückgabewert: Das ist eine praktikable Option, aber immer noch nicht so schön, weil dieser Wrapper irgendwie generiert werden müsste

Weiß jemand einen besseren Weg, dies allgemein zu erreichen? Der Grund, warum ich eine allgemeine Lösung brauche, ist, weil ich in einem Datenbankschema aus PL / SQL bequemen Quellcode erzeugen möchte.

    
Lukas Eder 15.12.2010, 22:39
quelle

3 Antworten

10

Meine Frage wäre: Warum gibt method nichts zurück? Anstatt ein In / Out-Argument zu setzen?

Aber vorausgesetzt Sie absolut, muss positiv ein In / Out-Argument haben, was eine ganz andere Frage ist, dann ist der Array-Trick in Ordnung. Alternativ ist es nicht weniger ungeschickt, aber die andere Möglichkeit besteht darin, eine Objektreferenz zu übergeben:

%Vor%

(Oder machen Sie einfach value public.) Sehen Sie? Ich sagte, es war nicht weniger tollpatschig.

Aber ich würde noch einmal fragen: Kann method nicht etwas zurückgeben? Und wenn es mehrere Dinge zurückgeben muss, kann es dann keine Objektinstanz mit Eigenschaften für diese Dinge zurückgeben?

Off-topic: Dies ist einer der Bereiche, in denen ich den C # -Ansatz wirklich mag. Eines der Argumente gegen In / Out-Argumente ist, dass sie an der Stelle unklar sind, an der Sie die Funktion aufrufen . C # macht es also klar, indem Sie das Schlüsselwort sowohl bei der Deklaration der Funktion als auch beim Aufruf angeben. In Ermangelung dieser Art von syntaktischer Hilfe, würde ich vermeiden, "in / out Argumente" zu simulieren.

    
T.J. Crowder 15.12.2010, 22:42
quelle
3

Java kopiert alles, was Sie als Argument übergeben. Wenn Sie eine primitive Inside-Methode übergeben, haben Sie eine Kopie dieses Primitivs, und keine Änderungen beeinflussen die tatsächliche Variable außerhalb der Methode. Wenn Sie ein Objekt übergeben, übergeben Sie eine Kopie der Referenz, die tatsächlich auf das ursprüngliche Objekt verweist. Auf diese Weise können Sie Änderungen an den Kontext von etwas weitergeben, das die Methode aufgerufen hat - indem Sie den Status des Objekts ändern, auf das die Referenz verweist. Sehen Sie mehr dazu: Ist Java nach Wert oder Referenz?

    
Arturs Licis 15.12.2010 22:45
quelle
1

Es gibt keinen direkten Weg. Andere Technik umfassen:

  • Übergeben eines Halterobjekts (ein bisschen wie Ihr 1-artiges Array)
  • Verwenden Sie z. B. einen AtomicInteger
  • Übergeben eines nützlicheren Objekts aus einer Geschäftsperspektive, die veränderbar ist
  • Ein Rückruf zu einer benutzerdefinierten Schnittstelle für den Empfang des Ergebnisses

Wenn Sie darüber nachdenken, ist der Array-Trick nicht unähnlich mit der Übergabe eines T * in C / C ++

    
dty 15.12.2010 22:42
quelle