3 回答

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊
在項目文件lambda:Lambda v4的狀態(tài)
根據(jù)第7節(jié),變量捕獲,提到....
我們的意圖是禁止捕獲可變的局部變量。原因是這樣的成語:
int sum = 0;list.forEach(e -> { sum += e.size(); });基本上是連續(xù)的; 寫這樣沒有競爭條件的lambda體是很困難的。除非我們愿意強(qiáng)制執(zhí)行 - 最好是在編譯時 - 這樣的函數(shù)無法逃避其捕獲線程,否則這個特性可能會導(dǎo)致比它解決的更多麻煩。
編輯:
另外需要注意的是,當(dāng)你在內(nèi)部類中訪問它們時,局部變量在內(nèi)部類的構(gòu)造函數(shù)中傳遞,而這對于非最終變量不起作用,因為非最終變量的值可以在構(gòu)造之后更改。
在實例變量的情況下,編譯器傳遞類的引用,類的引用將用于訪問實例變量。因此,在實例變量的情況下不需要它。
PS:值得一提的是,匿名類只能訪問最終的局部變量(在JAVA SE 7中),而在Java SE 8中,您可以有效地訪問lambda內(nèi)部的最終變量以及內(nèi)部類。

TA貢獻(xiàn)1829條經(jīng)驗 獲得超9個贊
因為實例變量總是通過對某個對象的引用的字段訪問操作來訪問,即some_expression.instance_variable
。即使您沒有通過點表示法顯式訪問它,例如instance_variable
,它也被隱含地視為this.instance_variable
(或者如果您在內(nèi)部類中訪問外部類的實例變量OuterClass.this.instance_variable
,那么它是在引擎蓋下this.<hidden reference to outer this>.instance_variable
)。
因此,永遠(yuǎn)不會直接訪問實例變量,而您直接訪問的實際“變量” this
(由于它不可分配,因此是“有效的最終”),或者是某個其他表達(dá)式開頭的變量。
添加回答
舉報