読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

今日の、変なコード

Java


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

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宣言しているクラス)ではない