メソッドの呼び出し元に値を引き渡す方法として、メソッドの返却値として渡す方法と、引数でオブジェクトを受け取り、そのオブジェクトに直接設定してやる方法がある。 後者はいわゆる参照渡しとなる。(正確には参照の値渡しだが本記事の趣旨からはずれるので「参照渡し」と表現する)
まずはサンプルコードをみてみよう。
public static void main(String[] args){
Member mb = new Member();
mb.setId("000001");
mb.setName(getName(mb.getId()));
mb.setAddress(getAddress(mb.getId());
}
private static String getName(String id){
String name = DAO.searchName(id);
return name;
}
private static Address getAddress(String id){
Address adrs = DAO.searchAddress(id);
return adrs;
}
メソッド引数に直接設定する方法(参照渡し)
public static void main(String[] args){
Member mb = new Member();
mb.setId("000001");
setName(mb);
setAddress(mb);
}
private static void setName(Member mb){
String name = DAO.searchName(mb.getId());
mb.setName(name);
}
private static void setAddress(Member mb){
Address adrs = DAO.searchAddress(mb.getId());
mb.setAddress(adrs);
}
「メソッドの返却値で受け取る方法」はgetメソッドの戻り値をMemberオブジェクトに設定している。 「メソッド引数に直接設定する方法」はMemberオブジェクトをメソッドに引き渡し、メソッド内で値が設定される。よって戻り値はvoidとなる。
まず、それぞれのメリット・デメリットを考えてみる。
方式 | メリ・デメ | 内容 |
---|---|---|
値返却 | メリット | メソッドのINとOUTがわかりやすい |
呼び出し元との依存度が低くなり再利用しやすい | ||
デメリット | 戻り値が1つしか返せない。 複数返却したい場合はBeanやMapなどオブジェクトを作ってやる必要がある。 | |
呼び出し元で返却値を再設定する必要がある | ||
参照渡し | メリット | 値の設定はメソッドが実施してくれるため、呼び出し元としては楽 |
戻り値が使える | ||
デメリット | メソッドが何をしてくれるかわかりづらい | |
メソッド名に悩む(setXXX?getXXX?) | ||
可読性が悪くなる | ||
呼び出し元との依存度が高くなる |
多くの意見として、値を設定してもらうだけのために参照渡しにするのは「Bad Practice」と考えられているようだ。 確かにコードがわかりづらくなるし、グローバル変数を使っているときのような罪悪感がある。バグも増えるだろう。
一般的なコーディングでもまずは値返却の方式を採用するのが多いかと思う。返却値が複数必要になったり、わざわざBeanを作成したくない場合などに参照渡しにすることが多いのではないだろうか。
まずは値渡しで検討し、それでも実現が困難だったり、コードが増える・複雑になってしまうなどの場合は参照渡しを採用するのがよいのではないかと思う。この辺は思想の違いもあるだろう。 なお参照渡しは、publicメソッドや共通処理として利用するメソッドではなるべく避け、長いソースをメソッドに切り出したようなprivateメソッドに留めるのがよい。参照渡しは引数のオブジェクトの型を意識することになり、呼び出し元との依存度が高くなるためである。