Javaの通常クラスと匿名クラスの違いと使い方

java

以前の記事で「通常のクラスと匿名クラスの書き方の比較を見たい」という意見があったので、少し補足を行います。

サンプルコードの通り、匿名クラスの場合、クラスに名前を付ける必要が無く、またオブジェクト生成と同時に処理を定義することができます。
これにより、以下のようなメリットがあります。

  • 記述を簡潔にできる
  • 使い捨てのクラスを定義でき、使い捨てであるという意図も明確にできる
  • (ソースファイル名とクラス名を同じにする場合)管理が容易になる

【サンプルコード】

・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!

良い意見やコメントを頂いた時は、今回のような形で答えていきたいと思います!

コメント

タイトルとURLをコピーしました