無名クラス

無名クラスは、名前を持たないその場限りのクラス実装を作成する。通常はインターフェースの実装クラスや抽象クラスのサブクラスとして作成する。

String[] strs = new String[]{"bbb", "aa", "dddd", "ccccc"};
		
Arrays.sort(strs, new Comparator<String>(){
    public int compare(String o1, String o2) {
        return o1.length() > o2.length() ? -1 : 1;
    }
});

Comparatorインターフェースは比較アルゴリズムをカプセル化する。アルゴリズムをオブジェクト化する、いわゆるストラテジーパターンの一種と言える。C言語等では関数ポインタを使用し、スクリプト言語では関数オブジェクト、ブロック、クロージャ、ラムダ等を使う場面だ。

あまり使うことはないが、通常のクラスのサブクラスとして無名クラスを作ることができる。ちょっとトリッキーな無名クラスの使い方だ。これはJUnit + EasyMock用に書いたコードだが、JavaBeansを継承した無名クラスのインスタンスをEasyMockのモックコントローラに渡している。無名クラスでは、自分自身を返すinitというメソッドを追加してテスト用の値をセットしている。

mockHogeDao.findById(1);
ctrlHogeDao.setReturnValue(new HogeBean() {
    HogeBean init() {
        this.setId(1);
        this.setFoo("foo");
        this.setBar("bar");
        return this;
    }
}.init(), 1);

テストケースで変数が多いと後々メンテするときに面倒なので、変数をできるだけ減らすためにこのような方法を使用した。宣言的に書ける構文があると、こんな事をせずに楽に書けそうな気がする。