この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
無名クラスとは匿名クラスとも呼ばれており、
名称の通り、名前を持たない一時的なクラスのことです。
(抽象)クラスを継承したり、インターフェースを実装したりして作成を行います。
記述方法は以下の通り
赤色の部分が無名クラスと呼ばれる部分です。
リストの中身をソートするための順序付けを定義するインターフェースを実装しています。
public class JavaTest {
public static void main(String[] args) {
List<Test> list = new ArrayList<Test>();
list.add(new Test(3,"boo"));
list.add(new Test(2,"foo"));
list.add(new Test(4,"woo"));
list.add(new Test(1,"goo"));
System.out.println(list);
Collections.sort(list, new Comparator<Test>() {
public int compare(Test o1, Test o2) {
return o1.id.compareTo(o2.id);
}
});
System.out.println(list);
}
}
class Test {
public Test(Integer id,String name) {
this.id = id;
this.name = name;
}
public Integer id;
public String name;
@Override
public String toString() {
return id + ":" + name;
}
}
無名クラスを使わずに書くと以下のようになります。
public class JavaTest {
public static void main(String[] args) {
List<Test> list = new ArrayList<Test>();
list.add(new Test(3,"boo"));
list.add(new Test(2,"foo"));
list.add(new Test(4,"woo"));
list.add(new Test(1,"goo"));
System.out.println(list);
Collections.sort(list, new ListComparator());
System.out.println(list);
}
}
class Test {
public Test(Integer id,String name) {
this.id = id;
this.name = name;
}
public Integer id;
public String name;
@Override
public String toString() {
return id + ":" + name;
}
}
class ListComparator implements Comparator<Test> {
public int compare(Test o1, Test o2) {
return o1.id.compareTo(o2.id);
}
}
コード量に大して差はないのですが、
比較の条件が近くにありコードが見やすくなっています。
他にもいろいろな利点があったりします。
一時的に一部のメソッドを上書きして使用したい場合などの重宝したりします。
(テストを行う際にモックを作成する代わりに疑似データを返すように上書きするなど)
簡単にですが今回はここまでに・・・。