以前の記事(https://cyzennt.co.jp/blog/2020/10/16/%e7%84%a1%e5%90%8d%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%81%af/)で「通常のクラスと匿名クラスの書き方の比較を見たい」という意見があったので、少し補足を行います。
サンプルコードの通り、匿名クラスの場合、クラスに名前を付ける必要が無く、またオブジェクト生成と同時に処理を定義することができます。
これにより、以下のようなメリットがあります。
・記述を簡潔にできる
・使い捨てのクラスを定義でき、使い捨てであるという意図も明確にできる
・(ソースファイル名とクラス名を同じにする場合)管理が容易になる
【サンプルコード】
・AnonymousClass.java
public class AnonymousClass {
private String str = "Hello Class!";
public String getStr() {
return str;
}
public void print() {
System.out.println(getStr());
}
}
・AnonymousSubClass.java
// 通常のクラスの定義(クラスの継承)
public class AnonymousSubClass extends AnonymousClass {
public void print() {
System.out.println("NonAnonymous:" + getStr());
}
}
・AnonymousInterface.java
public interface AnonymousInterface {
public void print();
}
・AnonymousImplementsClass.java
// 通常のクラスの定義(インターフェースの実装)
public class AnonymousImplementsClass implements AnonymousInterface {
public void print() {
System.out.println("NonAnonymous:Hello Interface!");
}
}
・AnonymousMain.java
public class AnonymousMain {
public static void main(String[] args) {
// 通常のクラスのオブジェクトの生成(クラスの継承)
AnonymousClass nac = new AnonymousSubClass();
nac.print();
// 匿名クラスの定義とオブジェクト生成(クラスの継承)
AnonymousClass ac = new AnonymousClass() {
public void print() {
System.out.println("Anonymous:" + getStr());
}
};
ac.print();
// 通常のクラスのオブジェクトの生成(インターフェースの実装)
AnonymousInterface nai = new AnonymousImplementsClass();
nai.print();
// 匿名クラスの定義とオブジェクト生成(インターフェースの実装)
AnonymousInterface ai = new AnonymousInterface() {
public void print() {
System.out.println("Anonymous:Hello Interface!");
}
};
ai.print();
}
}
【実行結果】
NonAnonymous:Hello Class!
Anonymous:Hello Class!
NonAnonymous:Hello Interface!
Anonymous:Hello Interface!