請考慮下面的情況下(這是Android的代碼片段)最終與非最終正常變量
在這種情況下假設兩者最後宣言和非最終聲明是很好,而且工作得很好。
我的問題是:將變量聲明爲final還是沒有任何性能優勢?我在很多地方都看到代碼中正常變量被定義爲final。我知道最後的關鍵詞是什麼,但我不知道這方面的性能考慮。
任何幫助將不勝感激。謝謝
請考慮下面的情況下(這是Android的代碼片段)最終與非最終正常變量
在這種情況下假設兩者最後宣言和非最終聲明是很好,而且工作得很好。
我的問題是:將變量聲明爲final還是沒有任何性能優勢?我在很多地方都看到代碼中正常變量被定義爲final。我知道最後的關鍵詞是什麼,但我不知道這方面的性能考慮。
任何幫助將不勝感激。謝謝
Java編譯器完全能夠確定哪些變量正在被更改,哪些不是(因此能夠首先執行像final
這樣的東西)。
自己聲明局部變量final
沒有性能優勢。唯一的優點是開發人員,例如能夠知道變量不會改變,並讓編譯器爲您驗證。
注意:在最終的非私有方法,類和成員變量中可能有優點。這提供了編譯器只能從該源代碼不能知道的信息。 (實際效果可能會有所不同)
更不用說更少的錯誤,因爲如果沒有編譯器錯誤,您無法寫入最終變量。 – hexafraction
那不是我。 downvoter可以解釋嗎? – hexafraction
這取決於JVM的實現。通過使用final
變量,java虛擬機可以自由繞過確保嚴格正確執行非最終變量所需的某些檢查和操作。
JVM將隱含最終本地變量不寫入。他們不能爲不是私人的字段做這件事,因爲另一個類可以被加載並寫入它們。
您還應該考慮在應該有的地方聲明一個變量final,以幫助防止在您嘗試寫入它時發生的錯誤。在這種情況下,您的編譯器將能夠更快地捕獲它們。總而言之,對於一個理智的JVM來說,宣佈最終的結果並不會有什麼不好。
感謝您的迴應,正如我所提到的,我的代碼將在dalvik虛擬機上運行,而不是JVM,請告訴我dalvik怎麼樣? –
@ABFORCE差不多。優化對最終字段和局部變量的訪問的概念思想仍然存在,以及保持可達性。 – hexafraction
「對於所有JVM,情況未必如此」任何您想要使用的JVM都會這樣做。 –
誰投票結束這個問題,因爲它_asks我們建議或找到一個工具/庫/非現場資源_真的很愚蠢 – BackSlash
@BackSlash我不問任何人推薦或找到一個工具對我來說,我只是詢問關於性能的考慮 –