Java実装OUTパラメータ

3157 ワード

[quote][size=medium]java関数には1つのタイプの戻り値しかありませんが、1つの関数に複数のタイプの戻り値がある場合は、どうすればいいのでしょうか.方法はありますか.答えは肯定的で、他の言語と同じようにOUTパラメータ(関数の出力として使用できるパラメータ)を使用します.次に例を見て、それらのパラメータがOUT機能を実現していることを見ます.
[/size][/quote]

/**
*
* Java OUT 。
*
* @author LoongHua
*
*/
class B{

String cnt=null;

public static void main(String[] args) {
B t=new B();//

String a=null;
String[]s=new String[1];
B b=new B();
Object o=null;

t.test1(a);
System.out.println(" :"+a);

t.test2(b);
System.out.println(" :"+b.cnt);

t.test3(s);
System.out.println(" :"+s[0]);

t.test4(o);
System.out.println(" :"+String.valueOf(o));
}

public void test1(String a){
a="aaaaaaaa";
}

public void test2(B b){
b.cnt="bbbbbb";
}

public void test3(String[] s){
s[0]="sssssssss";
}

public void test4(Object o){
o="sssssssss";
}
}


:null
:bbbbbb
:sssssssss
:null

[quote][size=medium]
Javaで2つの数を交換するプログラムを書きます.これは簡単ではありません.次は簡単に書けます.
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
Javaに詳しいあなたは、Java言語ではパラメータとしてパスby value(pass by value)で伝達される基本タイプなので、ここで変更するのは実際のパラメータではなく、伝達される「値」です.
私たちの目標を変更して、2つのオブジェクトを交換して、上のモードをそのままにします.
void swap(Object a, Object b) {
Object temp = a;
a = b;
b = temp;
}
この方法は正常に実行できますか?これは初心者を混乱させる問題です.一見、オブジェクトから渡されたのは引用です(pass by reference)、参照を変更した結果は外部に作用するはずです.実際には、この関数を呼び出す前後で、実際のパラメータであるオブジェクトは何も変更されません.つまり、これは時間の無駄な方法にすぎません.このpass by referenceは実際にはpass by valueでもあり、違いは、ここのvalueはreferenceです.だから、転送に対してのreference再割り当ては、コピーを操作するだけで、本尊は影響を受けません.
メソッドを設計する際、ほとんどのパラメータはINパラメータとして現れ、すなわちメソッドに値を入力するが、前のswapが望んでいたように、OUTパラメータとしてパラメータを作成する必要がある場合もある.IDL(Interface Definition Language)を知っていれば、これらの内容はあなたに少し親近感を与えるはずです.
C++では、OUTパラメータとしてパラメータを1つ望む場合は、ポインタと参照を思い浮かべるかもしれません.呼び出しコードに「&」をいくつか書かないように、参照を選択する可能性があります.
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
しかし、Javaでは、このような簡単なニーズに直面して、私たちは最も簡単な方法で完成することができません.理由はすでにはっきり言っています.まさか私たちは手をこまねいて捕まえるしかないのですか?明らかに違います.参照をどのようにするかはできませんが、参照が指す内容に手を焼くことができます.そこで、このような解決策があり、オブジェクトパッケージクラスを提供します.簡単に言えば、ここでは内部メンバーをpublicに設定します.
class ObjectHolder {
public Object object;
}
私たちのswapを書き換えます.
void swap(ObjectHolder a, ObjectHolder b) {
Object temp = a.object;
a.object = b.object;
b.object = temp;
}
ただし、呼び出し側のコードは複雑で、オブジェクトをObjectHolderにカプセル化する必要があります.これにより、swapが実行されると、ObjectHolderに置かれているオブジェクトは変更後のオブジェクトになります.元のオブジェクトにも影響を与えるには、ObjectHolderの値を取り出し、元のオブジェクトに値を割り当て直す必要があります.ApacheのAxisはこの方式でOUTパラメータの問題を解決した.
Java言語はC++から簡略化され、すべては簡単な原則に基づいているが、一部の場所は本当に簡単で、このような結果は簡単な機能を完成するために大きな曲がり角を回ることがある.そのため、Java言語はここ数年、発展の過程にある.Javaが完全になる日を待つかもしれませんが、簡単に形容する人はいません.
[/size][/quote]