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が初期化されているかどうかは運任せ! こんなハイリスクノーリターンなギャンブルをやる必要があるのかよ!

……というか、見つけた人はよく気づいたな。