Javaの匿名クラスでvarを使った変数宣言

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

匿名クラス(anonymous class)は、Javaプログラム内で一度だけ使われるクラスを定義するための手段です。
以下のような場面で使用されます。
例1) スレッドを定義し、その場で実行する場合

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

例2) インターフェースのメソッドを一度だけ実装するために使用される。例えばコールバックの実装。

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Timer ticked");
    }
});
timer.start();

他にも匿名クラスの用途は様々です。

匿名クラスでvarを使った変数宣言

Javaでは匿名クラス内でvarを使用することはできませんが、Java 10以降ではローカル変数型推論(Local Variable Type Inference)を導入しており、これを使用することができます。以下はその例です。

interface MyInterface {
  void myMethod();
}

public class Main {
  public static void main(String[] args) {
      MyInterface myAnonymousClass = new MyInterface() {
          // ローカル変数型推論を使用してvarで変数を宣言
          var myVariable = "Hello, var!";

          @Override
          public void myMethod() {
              System.out.println(myVariable);
          }
      };

      myAnonymousClass.myMethod(); // "Hello, var!" を出力
  }
}

この例では、匿名クラス内でvarを使用してmyVariableを宣言し、その後myMethodでその変数を使用しています。

Javaの匿名クラスの変数宣言でvarを使わない場合

interface MyInterface {
    void myMethod();
}

public class Main {
    public static void main(String[] args) {
        MyInterface myAnonymousClass = new MyInterface() {
            // varを使わずに型を明示的に指定
            String myVariable = "Hello, without var!";

            @Override
            public void myMethod() {
                System.out.println(myVariable);
            }
        };

        myAnonymousClass.myMethod(); // "Hello, without var!" を出力
    }
}

この例では、myVariableの型をStringとして明示的に指定しています。
varを使わない場合、変数の型を宣言する必要がありますが、varを使うことで型推論により冗長性を減少させることができます。

匿名クラスにコンストラクタは宣言できるのか

Javaの匿名クラスでは、インスタンスイニシャライザ(インスタンスを初期化するためのコードブロック)を使用してフィールドの初期化を行いますが、直接コンストラクタを宣言することはできません。
匿名クラスの宣言と同時に、そのインスタンスイニシャライザを使用してコンストラクタのような初期化を行うことが一般的です。

以下は例です。

interface MyInterface {
    void myMethod();
}

public class Main {
    public static void main(String[] args) {
        MyInterface myAnonymousClass = new MyInterface() {
            // インスタンスイニシャライザを使用して初期化
            {
                System.out.println("Initializing anonymous class");
            }

            @Override
            public void myMethod() {
                System.out.println("Executing myMethod");
            }
        };

        myAnonymousClass.myMethod(); // "Initializing anonymous class" と "Executing myMethod" を出力
    }
}

この例では、匿名クラス内で{ ... }で囲まれた部分がインスタンスイニシャライザであり、匿名クラスのインスタンスが生成される際に実行されます。