(注:このブログはもう更新していません)この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

[クラウド帳票エンジンDocurain]

今日の、変なコード


今日、こんなコードを見かけました。

new Foo().super();


僕の脳内:『なんじゃこりゃ???』→(5秒後)ああ、アレか。


さて、コレって何だかわかりますか?

正解は

class Foo {

    class Bar {
    }
}


class Baz extends Foo.Bar {

    public Baz() {
        new Foo().super();
    }
}

です。インナークラス*1を継承したクラスのコンストラクタでのみ記述可能な、とても珍しいコードです。


インナークラスは、宣言したクラスのインスタンスと結びつけないとインスタンス化できません。
だから、new Foo()とBarのコンストラクタ(super)の呼び出しを結びつける必要があるというわけ。


EffectiveJavaにも載っているステートメント

foo.new Bar();

の変形ですね。まぁ普通は使わないけども。

*1: ネストクラス(static宣言しているクラス)ではない