Javaの無名クラスで、final宣言しないといけないのは何故?

Java の無名クラス(他の言語でいうところのクロージャ?)では、外のスコープのfinal宣言されていない変数を参照しようとするとコンパイルエラーとなってしまう。


String name = "kenpoco";
new Object() {
public String toString() {
return name; // <== nameはfinal宣言されていないのでコンパイルエラー
}
}.toString();

このような仕様になっている理由を推測すると、

  • 無名クラス内で外側の変数に代入するようなコードは多くの場合無意味
  • 無意味でないにしても可読性が低く、混乱の元
というような理由が考えられるけど、よく考えてみれば「外側のスコープでfinal宣言されていなくても、無名クラス内では代入できない」という仕様にしてくれれば、全然問題ないと思うのだけど。つまり、代入した時点でコンパイルエラーにする、っていう事で。

いいと思うんだけどなあ。。