このエンクロージング内部クラスの内側からはnewするときに指定したOuterクラスのインスタンスが参照できます。
Ω ΩΩ<な、なんだってー
ってことは、イベントリスナーを内部クラスとして定義した場合は、内部クラスのインスタンス生成する時にわざわざthis渡す必要ないってことですか。
前回のせんだみつおを例にすると、
これが、
private class NahaNahaListener implements NahaNahaEventListener {
Player player = null;
public NahaNahaListener(Player player) {
this.player = player;
}
public void nahaNahaPerformed(NahaNahaEvent e) {
this.player.talk("<('A`)> ナハナハ!!");
}
}
Player player = null;
public NahaNahaListener(Player player) {
this.player = player;
}
public void nahaNahaPerformed(NahaNahaEvent e) {
this.player.talk("<('A`)> ナハナハ!!");
}
}
こうなる。
private class NahaNahaListener implements NahaNahaEventListener {
public void nahaNahaPerformed(NahaNahaEvent e) {
Player.this.talk("<('A`)> ナハナハ!!");
}
}
public void nahaNahaPerformed(NahaNahaEvent e) {
Player.this.talk("<('A`)> ナハナハ!!");
}
}
うーん、スッキリ。
publicな内部クラスのインスタンスを作るときに、親クラスのインスタンスからしか作れなくて気持ち悪かったんですが、こういう理由があったんですね。
ちなみに、C#は親クラスとのインスタンス共有はないので、関係性がサッパリしてます。
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
クラスの定義がネストしているだけで、名前空間+1といった感じです。
Javaはヌルヌル、C#はサラサラしているってイメージが何故かあったんですが、こういう部分が影響しているのかも。(あとはEclipseとVisualStudioの使用感の違いか)
t_yano - twitter
コンストラクタの中でクラスを定義するなどした。意外と知られていないJavaの機能「ローカル・クラス」。メソッド内でもクラスを定義できる。まあ匿名クラスから連想すれば当たり前の話なんだけどね。
Ω ΩΩ<あqswでfrtgyふjきぉp;
>親クラスのインスタンスからしか作れなくて
ってのは、「親クラスのインスタンスの中でしか作れない」ではなく、
通りすがりさんのコメントの状態を指してます。
説明下手で申し訳ない。
Outer.Inner inner = new Outer().new Inner();
内部クラスのインスタンス作るときは、親クラスのインスタンスが必要って意味です。
比較できるようにJavaのコードも書いておけば良かった。