[英]Final method arguments vs re-declaration of arguments as final variables in the method
[英]Final variables as method arguments
我正在查看同事的一些代碼並看到以下方法:
public void someMethod(final String str) {
...
}
我覺得很奇怪,因為弦樂是不可改變的。 我認為刪除final
關鍵字是安全的。
我還發現了以下內容
public void reportProblems(final Collection<IProblem> problems) {
...
}
周圍沒有任何內部類,所以..在那里使用final
關鍵字是否有意義? 在我看來,在決賽中有完全相同的沒有。 我對嗎?
謝謝
字符串的不變性與它是否被宣告為final
完全無關。 你可以有一個最終的StringBuilder
參數,它會阻止完全相同的事情:在方法中重新分配變量。 你仍然可以追加到StringBuilder
。 Java中的final
與C ++中的const
。
有些人喜歡在可能的情況下將所有內容都設為最終 - 如果您知道變量的值不會改變,則可以更容易地對其進行推理。 我對這種觀點有很多的同情,並且經常采用相同的方法 - 除了我實際上並沒有用final
修飾符強制解決這個問題,只是因為它增加了代碼中的瑕疵。 如果final
是默認值並且您必須明確使用mutable
修飾符,我懷疑大多數開發人員不會開始使每個局部變量都可變......他們只是在大多數情況下使用默認值,就像現在一樣。
所以,回到最初的問題:我懷疑開發人員只想明確他們的風格。 這不是我怎么做的,但我能理解動機。 另一種可能性是,在一個點有一個內部類,但現在走了,開發人員忘了刪除的final
修改。
當然,如果你的同事寫了代碼,你不必猜測 - 只要問!
在我看來,在決賽中有完全相同的沒有。 我對嗎?
你錯了,因為它並不完全一樣。
像下面的代碼將編譯而沒有最終 ...
public void someMethod(String str) {
str = "nonsense"; // will compile fine
}
...如果有最終結果,將無法編譯
public void someMethod(final String str) {
str = "nonsense"; // won't compile
}
“一個詞有多么不同”
它會阻止您在方法體內分配參數變量。 所以它確實有所作為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.