内部クラスと外部クラスの難

id:omochist:20061102:1162475536
ぶっちゃけ,内部クラスのinitializeで@xを渡してたら,内部の意味が無いよね.別に外部でもいけるよね.ただ内部クラスのスコープを外部クラスに限定しているだけで,そんなに利点が無いんじゃないの.
ってことに今朝気づいた.


なぜそもそも内部クラスを考えているかというと,JavaGUIの,ActionListenerをimplementした内部クラスを幾つも外部クラスに保持させて,幾つかのButtonにその幾つかの内部クラスを突っ込み,色んなボタンで色んな処理ができる,そんなことがRubyでもできないかしらと言う事を考えていたわけ.そこで,もう一度内部クラスをJavaで復習.

public class Hoge {
  private String x = "hoge";
    
  public static void main (String [] args) {
    Hoge h = new Hoge();
    h.hoge();
  }

  public void hoge () {
    Fuga f = new Fuga();
    f.hogera();
    System.out.println(x);
  }

  public class Fuga {
    public void hogera () {
      System.out.println(x);
      x += "fuga";
    }
  }
}

で,実行結果が

% java Hoge      
hoge
hogefuga

これが期待するものなのよねぇ.


ごちゃごちゃと考えていても意味が無いので,内部クラスについてググってみた.
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure

クロージャのカッコいいところ、其の壱。クロージャはコードブロックである。かつ、クロージャのある環境と結びつくことができる。これが正式なクロージャの形であり、関数ポインタやら内部クラスやらその他もろもろのクロージャっぽいものと一線を画す機能です。

てことは,クロージャは内部クラスよりも強いと読んでいいわな.すなわち,クロージャをウマく使うと内部クラスみたいに,と言うよりはむしろ内部クラスより高度に使えると言う事かな.


そう考えると,例えばJavaで言うbutton.addActionListener(new HogeListener())みたいなことをしなくても,Rubyならprocを渡してやれば解決するんだよね.あぁ,そりゃ確かに,内部クラスは要らないかもしれないし,考えなくても良い.別にわざわざActionListenerをimplementしてactionPerformed()を定義したクラスのオブジェクトを渡す必要なんて無くて,そのまま関数を渡してやれば良いんだ.高階関数みたいにして.もしくはブロック渡してyield.便利だねRuby