因為 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 的