因为 java 对 closure 的规范就是你不能够去变更 local variable 的 value
这种情境我一律推荐写一个 class 去包装
像这样
class StringValue {
private String value = "";
void set(String value) {
this.value = value;
}
String get() {
return value;
}
}
你只要把你的 left 改成这个物件就可以了
补充说明一下匿名内部类别不能修改 local variable 的原因
因为 local variable 是储存在 stack 的
当你 call 匿名内部类别的 method 时就开了一个新的 stack
参考到的 value 会 copy 一份到新的 stack
这时候你重新 assign 也没办法改变原本变量的 value
类似这种状况
int a = 10;
int aPrime = a;
aPrime = 5;
System.out.println(a) // 10
所以 java 才会要求被匿名内部类别参考到的区域变量必须要是 final 的