Javaのローカルクラスと匿名クラスの使い方を解説

Javaのローカルクラスと匿名クラスの違い

Javaのローカルクラスと匿名クラスは、いくつかの重要な違いがあります。

名前の有無:
ローカルクラスは、名前を持っており、クラス内で定義されます。通常はメソッド内にありますが、そのメソッド内でのみアクセス可能です。
匿名クラスは名前を持たず、その場で定義されます。
通常はインターフェースの実装や抽象クラスのサブクラスとして使用されます。

アクセス範囲:
ローカルクラスは、定義されたメソッド内でのみアクセス可能です。そのメソッド内でのみインスタンス化できます。
匿名クラスも通常はメソッド内で定義されますが、そのインスタンスは基本的に外部からアクセスできます。
ただし、外部変数を使用する場合、その変数はfinalまたは事実上のfinalである必要があります。

複数のインスタンス:
ローカルクラスは、そのクラスを含むメソッド内で複数のインスタンスを生成できます。
匿名クラスは、通常は一度だけインスタンス化され、その場で使用されることが一般的です。
再利用する場合は、変数に代入してから使うこともありますが、再利用のための設計ではない場合がほとんどです。
これらの違いを理解することで、それぞれのクラスの使い分けができるでしょう。

ローカルクラスの実装例

ローカルクラスの実装例を以下に示します。ローカルクラスは通常、メソッド内で定義されます。

public class LocalClassExample {

  public void performTask() {
      // ローカルクラスの定義
      class LocalTask {
          void execute() {
              System.out.println("ローカルクラスのタスクを実行しました");
          }
      }

      // ローカルクラスのインスタンス化とメソッドの呼び出し
      LocalTask localTask = new LocalTask();
      localTask.execute();
  }

  public static void main(String[] args) {
      LocalClassExample example = new LocalClassExample();
      example.performTask();
  }
}

この例では、LocalClassExampleクラス内のperformTaskメソッド内でLocalTaskというローカルクラスを定義しています。
その後、メソッド内でLocalTaskのインスタンスを生成し、そのメソッドを呼び出しています。
ローカルクラスの有用な側面は、メソッド内でのみ使用され、外部のクラスやメソッドとの密接な関連性がある場合に役立つことです。

匿名クラスの実装例

匿名クラスの実装例を以下に示します。
匿名クラスは通常、インターフェースの実装や抽象クラスのサブクラスとして使用されます。

public class AnonymousClassExample {

    interface Task {
        void execute();
    }

    public void performTask() {
        // 匿名クラスの定義とインスタンス化
        Task anonymousTask = new Task() {
            @Override
            public void execute() {
                System.out.println("匿名クラスのタスクを実行しました");
            }
        };

        // 匿名クラスのメソッドの呼び出し
        anonymousTask.execute();
    }

    public static void main(String[] args) {
        AnonymousClassExample example = new AnonymousClassExample();
        example.performTask();
    }
}

この例では、Taskというインターフェースを定義し、そのインターフェースを実装する匿名クラスを作成しています。
performTaskメソッド内で、Taskインターフェースの匿名クラスのインスタンスを生成し、そのexecuteメソッドを呼び出しています。

匿名クラスは通常、簡単な一回限りの使用や、簡潔な実装が必要な場合に便利です。