2011年8月30日火曜日

Java言語の不満

以下のように、インターフェースの実装を簡略化して書けるのだが
どうも無理やり押し込んだ感のある文法が好きになれない。
この場合、ローカル変数 localnum を
感覚的に参照出来るそうに見えるが、実際はできない。

その点、C#は、デリゲートやアクセッサがいい役割を果たしていて
かなり感覚的に読みやすいコードが書けるのでオススメだ。

public class Main implements InterfaceA
{
 private int classnum = 10;

 public void Test()
 {
  // パッと見でローカル変数も送れそうな感じがするが送れない
  int localnum = 10;

  // その場でインターフェースを実装
  ClassA a = new ClassA( new InterfaceA()
  {
   // 実装2
   @Override
   public void play()
   {
    //System.out.println("実装1, num=" + localnum); // 当然ローカル変数は NG
    System.out.println("実装1, num=" + classnum);
   }
  });

  a.play(); //  実装1がよばれる

  // 通常
  ClassA b = new ClassA();
  b.setInterfaceA(this);
  b.play(); //  実装2がよばれる
 }

 @Override
 public void play()
 {
  System.out.println("実装2, num=" + classnum);
 }
}
※補足 最近知ったのですが、C# 2.0 では匿名メソッドという機能が用意されていて 上記と似たようなかたちで、delegateに直接関数を実装できるようです。