さて、、次のjavaのコードを見て貰いましょう。
mainでほぼ同じ処理を2回しています。
違いは呼び出しているメソッドがtest1,test2と違うだけ。
そしてtest1,test2の違いはメソッド内の最初の行だけです。
結果を受け取った後に戻り値を更新しています。
その後、fooXの値を2行ずつ出力していますが何が出力されるか分かりますか?
public class Test { public static void main(String[] args) { Test test = new Test(); Bar bar1 = new Bar(100, "abc"); Foo foo1 = new Foo(bar1); Bar ret1 = test.test1(foo1); ret1.i = 10000; ret1.s = "ABC"; System.out.println(foo1.bar.i); //1回目処理の出力1 System.out.println(foo1.bar.s); //1回目処理の出力2 Bar bar2 = new Bar(100, "abc"); Foo foo2 = new Foo(bar2); Bar ret2 = test.test2(foo2); ret2.i = 10000; ret2.s = "ABC"; System.out.println(foo2.bar.i); //2回目処理の出力1 System.out.println(foo2.bar.s); //2回目処理の出力2 } public Bar test1(Foo foo) { Bar bar = new Bar(foo.bar.i, foo.bar.s); // ここでいろんな処理 return bar; } public Bar test2(Foo foo) { Bar bar = foo.bar; // ここでいろんな処理 return bar; } } class Foo { Bar bar; public Foo(Bar bar) { this.bar = bar; } } class Bar { int i; String s; public Bar(int i, String s) { this.i = i; this.s = s; } }
答えはこうです。
100 abc 10000 ABC
コードのどこを見てもfooXの更新なんてないですね。でも値は変わります。
test1とtest2で違いが出る理由が分からなかった人はもう少し頑張りましょう。
そして分かった人もtest2のようなメソッドは書かないようにしましょう。
test2メソッドを書いた人はjavaを理解していないか、
保守を全く考えていないか、
小さいプログラムしか書いたことが無いかの三択でしょうか。。
エンハンスやバグ修正などでfooXの更新場所を探さないといけなくなったらどうするんでしょうか。。
test2のようなのがあると機械的に探すのがほぼ不可能です。
こんなじゃTDDだってできないだろうに。。