2018年7月14日 星期六

java 跟 C# 在 anonymous inner class 中引用外部變數

在 java 中的 anonymous inner class 中引用外部變數時,需要該變數為 final 才能成功引用,這是因為在 java 中這樣的外部變數引用實際上是將變數 copy 一份副本並存在 inner class 中當作 object field 來使用的,這樣做的好處是 compiler 不需要下功夫建立出額外的 code 來讓 inner class 實際持有外部變數

瞭解了 java 引用外部變數的作法之後,試想若是能在 inner class 中將變數修改的話,看起來就會變得很奇怪了,這會讓人以為在 inner class 中的對外部變數的修改會在 inner class 外的 scope 生效,但所謂的引用只是副本,修改的也只是副本而已

既然如此,就乾脆定義只有 final 變數能被 inner class 引用,這樣就不能在 inner class 內修改變數,也不會讓人誤解

不過在 C# 中情況就不一樣了,C# 跟 java 的不同是 C# 為了開發便利,compiler 會幫你做很多事,在 C# 中 inner class 引用外部變數就真的是實際持有這個外部變數,在 inner class 中不但可以修改外部變數,而且修改後的結果在 inner class 外也可以真的看到

沒有留言:

張貼留言