1. ホーム

[解決済み】finalとeffectly finalの違いについて

2022-03-25 14:40:10

質問

Java 8でラムダを使っていて、次のような警告に出くわした。 local variables referenced from a lambda expression must be final or effectively final . 匿名クラスの中で変数を使用する場合、外側のクラスではfinalでなければならないことは知っています。 最終 実質的に最終 ?

解決方法は?

<ブロッククオート

... Java SE 8 からは、ローカルクラスは、final または実質的に final であるブロックのローカル変数とパラメーターにアクセスできます。 初期化された後、値が変更されない変数やパラメータは、実質的にfinalです。

例えば、変数 numberLength が final と宣言されていない場合、マーク付きの代入文が PhoneNumber のコンストラクタを使用します。

public class OutterClass {  

  int numberLength; // <== not *final*

  class PhoneNumber {

    PhoneNumber(String phoneNumber) {
        numberLength = 7;   // <== assignment to numberLength
        String currentNumber = phoneNumber.replaceAll(
            regularExpression, "");
        if (currentNumber.length() == numberLength)
            formattedPhoneNumber = currentNumber;
        else
            formattedPhoneNumber = null;
     }

  ...

  }

...

}

この代入文のせいで、変数numberLengthは事実上finalではなくなりました。 その結果、Javaコンパイラーは「quot;内部クラスから参照されるローカル変数はfinalまたはeffective finalでなければならない"」のようなエラーメッセージを生成します。 ここで、インナークラス PhoneNumber は、変数 numberLength にアクセスしようとします。

http://codeinventions.blogspot.in/2014/07/difference-between-final-and.html

http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html