10

PL / SQL(または他の多くの言語)では、プロシージャから返されるINOUTまたはOUTパラメータを使用できます。Javaで同様のことをどのように達成できますか?

私はこのトリックを知っています:

public void method(String in, String[] inOut, String[] inOut2) {
  inOut[0] = in;
}

ここで、inパラメーターはINパラメーターを表し、パラメーターinOutは戻り値を保持できます。規則String[] inOutは、の配列ですinOut.length == 1

それはちょっと不器用です。

回答へのフィードバックの編集:その他のトリックは次のとおりです。

  • ホルダー/ラッパークラスですが、新しいタイプやコールバックなどを導入したくありません。
  • 戻り値:一般的な解決策が欲しいのですが。つまり、いくつかのINOUTパラメータが関係しているものです。
  • 戻り値としてのINOUTパラメーターのラッパー:これは実行可能なオプションですが、ラッパーを何らかの方法で生成する必要があるため、まだそれほど適切ではありません。

誰かがこれを一般的に達成するためのより良い方法を知っていますか?一般的なソリューションが必要な理由は、データベーススキーマのPL/SQLから便利なソースコードを生成したいからです。

4

3 に答える 3

12

私の質問は次のようになります:なぜ何かをmethod 返さないのですか?in / out引数を設定するのではなく?

しかし、絶対に、積極的にin / out引数が必要であると仮定すると、これはまったく別の質問であり、配列のトリックは問題ありません。あるいは、それほど不器用ではありませんが、別の方法は、オブジェクト参照を渡すことです。

public class Foo {
    private String value;

    public Foo(String v) {
        this.value = v;
    }

    public String getValue() {
        return this.value;
    }

    public void setValue(String v) {
        this.value = v;
    }
 }

 // ....
 public void method(String in, Foo inOut) {
     inOut.setValue(in);
 }

(または、もちろん、value公開するだけです。)参照してください。不器用ではないと言った。

しかし、私はもう一度尋ねます:method何かを返すことはできませんか?また、複数のものを返す必要がある場合、それらのプロパティを持つオブジェクトインスタンスを返すことはできませんか?

オフトピック:これは、C#アプローチが本当に好きな分野の1つです。in / out引数に対する引数の1つは、関数を呼び出している時点では不明確であるということです。したがって、C#は、関数の宣言時と呼び出し時の両方でキーワードを指定することにより、明確にします。そのような構文上の助けがないので、私はin/out引数を「シミュレート」することを避けたいと思います。

于 2010-12-15T22:42:13.373 に答える
4

Javaは、引数として渡したものをすべてコピーします。プリミティブのinsideメソッドを渡すと、そのプリミティブのコピーがあり、変更が実際の変数のoutsideメソッドに影響を与えることはありません。オブジェクトを渡す場合は、参照のコピーを渡します。これは、実際には元のオブジェクトを参照しています。これは、参照が「指している」オブジェクトの状態を変更することにより、メソッドを呼び出したもののコンテキストに変更を伝播する方法です。詳細については、「Javaは値渡しですか、それとも参照渡しですか?」を参照してください。

于 2010-12-15T22:45:59.567 に答える
1

直接的な方法はありません。その他の手法は次のとおりです。

  • ホルダーオブジェクトを渡す(1-ary配列に少し似ています)
  • たとえば、AtomicIntegerを使用する
  • たまたま変更可能であるビジネスの観点から、より有用なオブジェクトを渡す
  • 結果を受信するためのカスタムインターフェイスへのコールバック

あなたがそれについて考えるならば、配列のトリックはC /C++でT*を渡すことと同じです

于 2010-12-15T22:42:20.707 に答える