2014-11-03 47 views
0

已經討論了局部變量finaleffectively final的區別here。但我不明白爲什麼它是在Java 8中引入的。對我來說,它似乎只是讓程序員可以自由地忽略關鍵字final,但將變量有效地視爲最終的。邏輯上沒有變化,只是幫助'懶'程序員不需要寫final爲什麼在Java 8中引入'有效最終'?

這不就是一個退步,因爲現在一個有效的最終變量會遺漏關鍵字,而不會向代碼的讀者指出它。那麼,甲骨文有什麼理由讓這裏的最終關鍵字被忽略嗎?

+1

它不引入比較。引入的是從Lambda表達式訪問這些變量的能力。 'Effectively final'只是一種描述實際上沒有改變的變量的方式,而它是在Java創建後存在的變量。 – RealSkeptic 2014-11-03 13:51:05

+0

http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final – Akshay 2014-11-03 13:51:06

+0

少代碼說更多不稱爲「懶惰」,而是「表現力」。值得慶幸的是,Java已經開始欣賞這種美德。 – 2014-11-03 13:59:18

回答

4

Java中的閉包(從1.1版開始存在)只能關閉final變量。通過匿名類的無可奈何的詳細語法,幾個額外的修飾符並不是什麼大不了的事情(儘管它們在參數列表中跳到你身上時偶爾會感到驚訝),但是使用新的簡潔lambda語法,它們是。它們還會導致lambda更少地融入代碼結構中。特別是考慮嵌套lambda表達式的情況:

new TreeSet<Integer>((a, b) -> uncheckCall(() -> exceptionThrowingMethod(a, b))) 

new TreeSet<Integer>((final Integer a, final Integer b) -> 
    uncheckCall(() -> exceptionThrowingMethod(a, b)) 
相關問題