2008年05月10日

Javaの内部クラス

内部クラスの階層 - 凪瀬 Blog
このエンクロージング内部クラスの内側からは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`)> ナハナハ!!");
    }

}


こうなる。
private class NahaNahaListener implements NahaNahaEventListener {

    public void nahaNahaPerformed(NahaNahaEvent e) {
        Player.this.talk("<('A`)> ナハナハ!!");
    }

}


うーん、スッキリ。
publicな内部クラスのインスタンスを作るときに、親クラスのインスタンスからしか作れなくて気持ち悪かったんですが、こういう理由があったんですね。

ちなみに、C#は親クラスとのインスタンス共有はないので、関係性がサッパリしてます。
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

クラスの定義がネストしているだけで、名前空間+1といった感じです。

Javaはヌルヌル、C#はサラサラしているってイメージが何故かあったんですが、こういう部分が影響しているのかも。(あとはEclipseVisualStudioの使用感の違いか)



t_yano - twitter
コンストラクタの中でクラスを定義するなどした。意外と知られていないJavaの機能「ローカル・クラス」。メソッド内でもクラスを定義できる。まあ匿名クラスから連想すれば当たり前の話なんだけどね。


Ω ΩΩ<あqswでfrtgyふjきぉp;
posted by 膳 at 00:44| Comment(2) | TrackBack(0) | Java
この記事へのコメント
outer.newの書式を使えば親クラスのインスタンスの外から内部クラスをnewしたりできます。
Posted by 通りすがり at 2008年05月10日 20:55
>> 通りすがりさん

>親クラスのインスタンスからしか作れなくて
ってのは、「親クラスのインスタンスの中でしか作れない」ではなく、
通りすがりさんのコメントの状態を指してます。
説明下手で申し訳ない。

Outer.Inner inner = new Outer().new Inner();

内部クラスのインスタンス作るときは、親クラスのインスタンスが必要って意味です。
比較できるようにJavaのコードも書いておけば良かった。
Posted by 膳 at 2008年05月11日 12:14
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/14783904

この記事へのトラックバック