Javaの無名クラスで、final宣言しないといけないのは何故?
Java の無名クラス(他の言語でいうところのクロージャ?)では、外のスコープのfinal宣言されていない変数を参照しようとするとコンパイルエラーとなってしまう。
String name = "kenpoco";
new Object() {
public String toString() {
return name; // <== nameはfinal宣言されていないのでコンパイルエラー
}
}.toString();
このような仕様になっている理由を推測すると、
- 無名クラス内で外側の変数に代入するようなコードは多くの場合無意味
- 無意味でないにしても可読性が低く、混乱の元
いいと思うんだけどなあ。。