Javaで無名クラスを使用する場面

Javaで無名クラスを使用する場面

Javaで無名クラス(Anonymous Class)を使用する場面はいくつかあります。
無名クラスは、クラスの定義とインスタンス化を一度に行うことができ、通常は非常に短いコードを記述する際に使用されます。
以下に具体的な例とその使用場面を示します。

1. イベントリスナーの実装

GUIアプリケーションでは、ユーザーのアクションに応じてイベントを処理するためにイベントリスナーを実装します。
無名クラスは、特定のイベントリスナーの実装を簡潔に行うために便利です。

import javax.swing.JButton;
import javax.swing.JFrame;

public class AnonymousClassExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Anonymous Class Example");
        JButton button = new JButton("Click Me");

        button.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent e) {
                System.out.println("Button clicked!");
            }
        });

        frame.add(button);
        frame.setSize(200, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

この例では、ActionListenerインターフェースを実装した無名クラスを使って、ボタンがクリックされたときのアクションを処理しています。

2. コールバック処理

コールバック処理が必要な場合にも無名クラスを利用できます。
特に、インターフェースのメソッドを一度だけ実装する場合に便利です。

public class CallbackExample {
    interface Callback {
        void onComplete(String result);
    }

    public void processData(Callback callback) {
        // データ処理が行われる
        callback.onComplete("Data processed");
    }

    public static void main(String[] args) {
        CallbackExample example = new CallbackExample();
        example.processData(new Callback() {
            @Override
            public void onComplete(String result) {
                System.out.println(result);
            }
        });
    }
}

ここでは、Callbackインターフェースの実装を無名クラスで行い、processDataメソッドに渡しています。

3. 一時的なオブジェクトの生成

無名クラスは、一時的なオブジェクトが必要な場合にも使用されます。
これにより、クラスを別に定義せずに済むため、コードがスッキリします。

public class TemporaryObjectExample {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Running in a separate thread");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }
}

この例では、Runnableインターフェースを実装する無名クラスを使用して、スレッドで実行する処理を定義しています。

4. 比較や検証のカスタマイズ

比較や検証の処理をカスタマイズしたいときにも無名クラスが便利です。
例えば、コレクションのソートやフィルタリングなどで使われます。

import java.util.Arrays;
import java.util.Comparator;

public class SortingExample {
    public static void main(String[] args) {
        String[] words = {"apple", "banana", "cherry"};

        Arrays.sort(words, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1); // 降順でソート
            }
        });

        for (String word : words) {
            System.out.println(word);
        }
    }
}

ここでは、Comparatorインターフェースを無名クラスで実装し、文字列の配列を降順にソートしています。

まとめ

無名クラスは、主に以下の場面で利用されます:

  • イベントリスナーの実装
  • コールバック処理
  • 一時的なオブジェクトの生成
  • 比較や検証のカスタマイズ

これらの場面で無名クラスを使用することで、コードの簡潔さと可読性を保ちながら、必要な機能を迅速に実装できます。