2011/01/12(水)この会社辞めようと思ったソースコード
2011/01/12 24:37
正常に起動したりしなかったりする画面がありまして、その画面の調査をしていました。思いっきり簡略化してしまうと以下のようなソースになっています。
public class Child extends Parent { private Foo foo = new Foo(); public Child(String s) { super(s); } public void bar(){ this.foo.method(); } }
これは手順書に書かれているとおりの記述であり、特に問題はないように思えました。同じチームの人に指摘されて、基盤部分のParentクラスのソースを見るまでは。
public class Parent { public Parent(String s) { : : this.bar(); } public void bar() {} }
つまり、コンストラクタが完全には終わっていないため、Childクラスのbar()が呼ばれた時点でfooが初期化されているかどうかは運任せ! こんなハイリスクノーリターンなギャンブルをやる必要があるのかよ!
……というか、見つけた人はよく気づいたな。