無名クラスは、名前を持たないその場限りのクラス実装を作成する。通常はインターフェースの実装クラスや抽象クラスのサブクラスとして作成する。
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);
テストケースで変数が多いと後々メンテするときに面倒なので、変数をできるだけ減らすためにこのような方法を使用した。宣言的に書ける構文があると、こんな事をせずに楽に書けそうな気がする。