今日、こんなコードを見かけました。
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宣言しているクラス)ではない