Javaの匿名内部クラスについて

先日、仕事でJavaのSwingを書いていたところ、匿名内部クラスを利用しているコードに遭遇した。覚えておくと便利そうなので、とりあえずメモしておく。
 

匿名内部クラスとは

匿名内部クラスとは、「その場限り」のサブクラスもしくは実装クラスを作る方法である。new スーパークラス名( コンストラクタの引数 ) { /* 実装 */ }という書式で、「名前のない」クラスを作ることができる。
匿名クラスは必ず、スーパークラスのサブクラスか、インターフェイスの実装クラスとして作らなければならない。単独のクラスとして作る場合には、Objectクラスのサブクラスとして作ることになる。スーパークラスの代わりにインターフェイスを使用し、その実装クラスを作ることもできる。
また、匿名クラスは「名前のないクラス」のため、参照型変数を作ることができない。そのため、基本的に「オーバーライドするメソッド」もしくは「実装するメソッド」以外にpublicメソッドを作ることはない。新規に追加したpublicメソッドを外から呼ぶ方法がないためである。
つまり、匿名クラスは、サブクラスもしくは実装クラスを手っ取り早く作る方法であり、それ以外の目的に使うことは難しいということである。
 

どういった場合に使うか

匿名内部クラスは、「ある1箇所でしか使わないような、わざわざクラスを作るほどでもないようなコード」を書く場合において、とても短く書けて便利である。
 
例えば、JavaのSwingでJTableのセルの見た目を変更するには、新しくTableCellRendererクラスを継承したクラスを定義しなければならないが、今回限りしか使わない場合、以下のように匿名内部クラスを用いて定義することが出来る。

table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
    JTableHeader header = adaptee.tableHeader;

    @override
    public Component getTableCellRendererComponent(JTable _table, Object _value, boolean _isSelected, boolean _hasFocus, int _row, int _column) {
        return header.getDefaultRenderer().getTableCellRendererComponent(_table, _value, _isSelected, _hasFocus, _row, _column);
    }
});

 
 
以上
 
 
参考
匿名クラスとは : JavaA2Z

Article written by

Comments are closed, but trackbacks and pingbacks are open.