技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:通常のクラスと匿名クラス(無名クラス)の書き方の比較

以前の記事(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!