メソッド内で定義されている内部クラスがメソッドのローカル変数を参照する場合、その変数はfinalでなければならない

しかし、Java言語の内部クラスを設計している最中は「finalでなくともよい」という選択肢も検討されたようだ。その場合、ローカル変数はスタックでなくヒープに割り当てないといけない*1。当時のJava言語は明示的にnewする以外はヒープからのメモリ確保はしない、という設計方針であったらしいので結局今の仕様になったとか。

*1:いわゆる「環境」というやつだ。