Java 8 引入的眾多功能中,其中一個最有趣的功能是 effectively final。即不用 final 修飾符也能達(dá)到同樣的效果。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、滑縣網(wǎng)站維護(hù)、網(wǎng)站推廣。本文將介紹該功能的起源以及編譯器處理 effectively final 與 final 關(guān)鍵字的不同之處。此外,還會通過一個 effectively final 變量的問題案例給出解決方案。
簡而言之,如果對象或基礎(chǔ)類型的變量在初始化后值不發(fā)生改變,則可以把它們看做 effectively final。只要不改變對象引用,即使引用的對象發(fā)生狀態(tài)改變,該對象也是 effectively final。
在 Java 引入該功能之前,不能在匿名類中使用非 final 局部變量。此外,也不能在匿名類、內(nèi)部類和 lambda 表達(dá)式中多次賦值。新功能的加入節(jié)省了為 effectively final 變量輸入 final 關(guān)鍵字的工作。
匿名類是一種內(nèi)部類,不能訪問非 final 變量或 effectively final 變量,也無法按照 JLS 8.1.3 的規(guī)定在其封閉作用域內(nèi)的變量進(jìn)行修改。lambda 表達(dá)式也有類似的限制,修改變量可能會帶來并發(fā)問題。
docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
要確認(rèn)一個 final 變量是不是 effectively final,最簡單的辦法就是刪除 final 關(guān)鍵字看能否編譯并運(yùn)行: