Loading [MathJax]/jax/output/HTML-CSS/config.js

2010-10-01

無名クラス、匿名クラスを理解する

GWTのRPCを利用するときに、無名クラスの記述がでてきます。Javaに慣れていない人にはわかりにくいところですので、無名クラスについて取り上げます。
例えば、以下のようなインタフェースが定義されていたとします。このインタフェースには2つの抽象メソッドが定義されています。抽象メソッドですので、定義されているのは名前だけで、実際の内容は実装するクラスで書く必要があります。
  1. interface Callback {  
  2.   void onSuccess();  
  3.   void onFailure()  
  4. }  
つづいて、このインタフェースを実装するクラスを作成します。必ずCallbackインタフェースで定義されているメソッドを定義しなければなりません。
  1. class TestImpl implements Callback{  
  2.   void onSuccess(){  
  3.    //ここに何かかく  
  4.   }  
  5.  void onFailure(){  
  6.    //ここに何かかく  
  7.   }  
  8. }  
そして、実際に利用するときには、下記のように書くことになります。
このようにクラスのインスタンスを生成することで、onSuccess等のメソッドを呼び出すことができます。
  1. Callback test = new TestImpl();//あるいは右のような書き方でもよい TestImpl test = new TestImpl();  
  2. test.onSuccess();  
上記のクラスを宣言する手間を省けるのが無名クラスです。以下のように省略することができます。
  1. Callback test = new Callback{  
  2.   void onSuccess(){  
  3.    //ここに何かかく  
  4.   }  
  5.  void onFailure(){  
  6.    //ここに何かかく  
  7.   }  
  8. }  
何が省略されているかわかりますか?インタフェースクラスは、直接newすることはできませんが、このようにnewしながら中身を定義することで、newされるものは Callbackインタフェースを実装した何か?(つまり無名のクラス)になります。だから、インタフェースで受け取ることができます。

0 件のコメント:

コメントを投稿