Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

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

匿名クラスで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" を出力
    }
}

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