内部クラス4
無名クラス
ローカルクラスをさらに発展させて話を進めると無名クラスの話になります
無名クラスは、非常に高度なクラスの扱いの一つと言えるでしょう
ローカルクラスは、メンバの定義と生成を一つのメソッド内で行うことができました
しかし、それでもその作業は別々に行われていましたね
無名クラスは定義とインスタンス生成を同時に行う技術です
無名クラスの概念上の位置付けは、ローカルクラスの一種で
一つの式としてクラス定義、インスタンスの生成が同時に行われます
次のプログラムは、前回のローカルクラスを無名クラスに省略化したものです
class test {
public static void main(String args[]) {
top obj = new top();
Neko rena = obj.getNeko();
rena.write();
}
}
class top {
Neko getNeko() {
return new Neko() {
void write() {
System.out.println("Kitty on your lap");
}
};
}
}
abstract class Neko {
abstract void write();
}
抽象クラスNekoが、top.getNeko()によってインスタンス化され返されます
この動作は前回のプログラムと同じですが、定義部がありません
returnステートメントで返す前に、同時に式として定義しています
定義された後に、newキーワードでインスタンス化されてオブジェクトが渡されます
この一連の作業は非常にコンパクトになりましたね
コンパイルすると、top$1.class というクラスファイルが生成されています
これが無名クラスで定義したクラスファイルです
GUIのイベントハンドラプログラムは、このように拡張しなければならないクラスや(アダプタクラスという)
インプリメントして定義しなければならないインターフェイスが沢山あります
そのような処理において、内部クラスを用いるのはごく一般的であり、よく見られるソース記述法です
しかし、このように内部クラスは一部実装上で非常にややこしい一面があります
そのため、専門家の中には悪影響のほうが多いと指摘する人もいます
文章が長くなるようではトップクラスとして定義したほうが良いのはたしかです
とくに無名クラスは短い文ですむような簡易記法として用いるべきであり、乱用は避けましょう