2011年7月19日火曜日

引数=値渡しと参照渡し

Java全般の話。

通常、Javaのメソッド引数は値だけが渡される。


void aaa(){
    String strDamy="000";
    bbb(strDamy);
    System.out.println("strDamy = " + strDamy);
}

void bbb(String _str){
    _str="123";
}


こんなコードを書いてもメソッドの呼び元ではStringの値は変わらない。

表示されるのは「000」のはず。

C言語だと「ポインタ」を使うし、VBなら「ByRef」を使う

Javaはどうするか。

コレクション等でラップしてやる。


void aaa(){
    String strDamy="000";
    ArrayList arrDamy = new ArrayList();
    arrDamy.add(strDamy);
    bbb(arrDamy);
    strDamy = (String)arrDamy.get(0);
    System.out.println("strDamy = " + strDamy);
}

void bbb(ArrayList _arr){
    String str="";
    str=(String)_arr.get(0);
    _str="123";
    _arr.clear();
    _arr.add(str);
}

初歩的な事だけど、知らずに苦労した。

通常は返値をvoidからStringにしてreturnすれば事たりる。

しかし、すでに返値が使用されている場合、しょうがなく引数で返さないといけない場面も出てこよう。

返値をArrayListにして全部突っ込めばいいんじゃないかと言う話もある。

その辺は設計しだいなので各自の判断で。

そして、この方法がベストかと言うと分からない。

いくつかある方法の一つなのかもしれない。

知ってる人は教えて下さい。

-----------------
2011/07/20 追記:
-----------------
コメントで「StringBuffer」を使うと楽になるとの事なので、修正コードを転記する。

void aaa(){
     StringBuffer strDamy = new StringBuffer("000");
     bbb(strDamy);
     System.out.println("strDamy = " + strDamy);
}

void bbb(StringBuffer _str){
     _str.setLength(0);
     _str.append("123");
}

String型は良く使うのでStringBufferで代用すると言うのはかなり有益だ。

話は変わり、この記事で言いたかった事は、オブジェクト内の値の受け渡しについて。

実際にあった話として
CConnectDB conDB; // DB接続用のオブジェクト
Statement st;         // DB操作用のオブジェクト

conDB」や「st」を引数に渡して、その先のメソッドで値を変えても戻ってきたら何も変わってなかった。困った。
なので、String型やその他の変数やオブジェクトで代用が効く方法があればいいが、通常はやはりArrayなどのコレクションに入れて渡すのが手っ取り早いと思われ。

できればスッキリした分かり易いコードを書きたいが・・・


   ↓クリックで、このブログの評価が上がり執筆者が喜びます
 にほんブログ村 IT技術ブログ プログラム・プログラマーへ
   にほんブログ村

1 件のコメント:

謎のぬけさく士 さんのコメント...

StringBufferを使用すればもっと簡単になりますよ。

void bbb(StringBuffer _str){
_str.setLength(0);
_str.append("123");
}

void aaa(){
StringBuffer strDamy = new StringBuffer("000");
bbb(strDamy);
System.out.println("strDamy = " + strDamy);
}