staticのメンバークラスで遅延初期化

staticのメンバークラスは遅延初期化されるらしいので試してみた。

class Hoge {
    private final String clientName;

    Hoge(String clientName) {
        this.clientName = clientName;
        System.out.println(
            "Hoge's constructor was called by " + clientName
        );  
    }

    String getClientName() { return clientName; }
}

class Foo {
    private static final Hoge hoge = new Hoge("Foo");

    private static class Bar {
        private static final Hoge hoge = new Hoge("Bar");
        private static final Hoge dmyHoge = new Hoge("Bar(dummy)");
    }

    private static Hoge getHoge() { return Bar.hoge; }

    public static void main(String argv[]) {
        System.out.println("Start");
        System.out.println(
            "clientName : " + getHoge().getClientName()
        );  
        System.out.println("End");
    }
}

Fooクラスのhogeフィールド同様に、Barクラスのhogeフィールドの初期化もEagerに行われると思っていたのだが、Foo.getHoge()でBarにアクセスされたタイミングで初期化される。

komamitsu@onion:~/lab/java/EJ/20100920$ java Foo
Hoge's constructor was called by Foo
Start
Hoge's constructor was called by Bar
Hoge's constructor was called by Bar(dummy)
clientName : Bar
End

とまぁ大したネタでなくても無理やりコードを書いてみるのであった。