2

重複の可能性:
Java で参照渡しする方法がない理由

参照渡しのメソッド パラメータを処理するときに、Java が C# の「out」型機能を正確に提供しない理由を誰か教えてもらえますか? つまり、参照渡しなど、ブール値などのプリミティブ データ型を渡すことができないのはなぜでしょうか。ラッパークラス java.lang.Boolean も試しましたが、まだ役に立ちません。それでも、変数を参照渡しすることはできません。
バージョン 7 でも Java がまだこれを提供していない特定の理由はありますか?

4

4 に答える 4

5

Javaには値渡ししかありません。これは、言語が設計されたときに下された決定です。

パラメーターの受け渡しモードは 1 つ (値による受け渡し) だけであり、これは物事をシンプルに保つのに役立ちます。

-- James Gosling ほか著、Java プログラミング言語、第 4 版

必要に応じて、ブール値を可変クラス内のメンバーとして配置し (Boolean不変であるため使用できません)、そのクラスへの参照を渡すことができます。Apache Commons には、MutableBoolean使用できる というクラスもあります。

于 2012-04-26T05:48:19.763 に答える
1

理由を説明できるのは言語設計チームだけですが、"out" パラメーターを許可しない理由は次のようなものかもしれません: 2 つのことを計算するメソッドが必要な場合、本当に必要なのは 2 つのメソッドか、オブジェクトを返します。これにより、より優れた設計とより保守しやすいコードが得られると思われます。

本当に「出力パラメーター」が必要な場合は、1 つの要素の配列を簡単に使用できることに注意してください。例えば:

void div(int a, int b, int[] q, int[] r) {
    if (q != null) q[0] = a/b;
    if (r != null) r[0] = a%b;
}

// elsewhere:
int[] quotient = new int[1];
int[] remainder = new int[1];
div(4, 3, quotient, remainder);
于 2012-04-26T05:59:40.483 に答える
0

これは私の意見にすぎませんが、Java の設計者は、機能をより直感的で扱いやすくするのではなく、機能を削除することでプログラミングを単純化できると信じていたように感じます。

于 2012-04-26T05:59:50.797 に答える
0

簡単に言えば、それは設計上の決定であり、参照渡しでできることはオブジェクト参照を値渡しでできないということです。

特定の問題に関しては、2 つの解決策があります。

変更可能なラッパー クラス:

final class BooleanRef {
    public boolean value;
}

そしてそれを次のように使用します:

// Function
void changeTheBoolean( BooleanRef b ){
    b.value = true;
}

// Call:
BooleanRef b = new BooleanRef();
changeTheBoolean( b );

または、(よりハックですが、より軽量) 配列でラップします。

// Function
void changeTheBoolean( boolean[] b ){
    b[0] = true;
}

// Call:
boolean[] b = new boolean[1];
changeTheBoolean( b );
于 2012-04-26T06:24:40.927 に答える