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
とまぁ大したネタでなくても無理やりコードを書いてみるのであった。