作為一個新切換到Java的用戶,我意識到在我們的專案和其他一些Java專案中,final關鍵字是常用的,并且在閱讀了幾個教程和SO執行緒后,例如在Java中過度使用“final”關鍵字,我認為有一些例子不需要final關鍵字。所以,這里是我感到困惑的幾點:
1.final類和介面的方法引數中是否需要使用關鍵字?因為
CompanyDTO findByUuid(final UUID uuid);
//or
@Override
public CompanyDTO findByUuid(final UUID uuid) {
//...
}
2.據我所知,它對執行緒安全也有好處,但我需要了解為什么它在 Java 中幾乎所有可能的地方都使用的基本思想。通常用于不會改變的變數。那么,請您解釋一下常見用法的想法嗎?
uj5u.com熱心網友回復:
- 是否需要在類和介面的方法引數中使用 final 關鍵字?
沒有任何。因為使用它的效果微乎其微。
- 據我所知,它也有利于執行緒安全
一點也不。對原始引數的更改在方法主體之外是不可見的。另一方面final,不會阻止您對參考型別引數呼叫方法。
換句話說:如果你的方法主體做了一些最終導致不同執行緒之間競爭條件的事情,那么final根本沒有幫助。
絕對唯一使用finalfor 引數阻止您做的事情:為其重新分配值。因此,它可以幫助防止愚蠢的錯誤。但它幾乎歸結為純粹的風格。以我為例,我幾乎從不使用它,并且大部分時間都認為它是無用的雜亂/噪音。
uj5u.com熱心網友回復:
這通常是不必要的,除非該物件在多個地方被參考。
uj5u.com熱心網友回復:
- 在方法引數上使用 final 修飾符沒有多大意義,因為它會給方法宣告增加視覺上的混亂,而不會花太多錢。只要您可以確保不會將值重新分配給這些變數,您就可以在方法引數上不使用 final 修飾符。
- 方法引數位于堆疊上,并且對于該特定執行緒而言是本地的,只要該執行緒不將其發布到其他執行緒。由于它不在其他執行緒之間共享,因此這里不會出現執行緒安全問題。但是,如果當前執行緒發布了這些引數,那么您就不走運了,并且使用 final 修飾符不會給您任何執行緒安全保證。
這是使用 final 修飾符來撰寫一個代表二維空間中一個點的不可變類的有效用法。
class Point2D {
private final int x;
private final int y;
Point2D(int x, int y) {
this.x = x;
this.y = y;
}
// Remainder omitted for brevity's sake !
}
一旦創建了此類實體,您就可以與其他執行緒自由共享它,而無需費心同步訪問它的狀態。因此,不可變物件免費為您提供執行緒安全。
您可以閱讀 JLS § 17.5以獲取有關 final 欄位語意的更多詳細資訊。
uj5u.com熱心網友回復:
1.類和介面的方法引數中是否需要使用final關鍵字?
這取決于這些方法的作用。例如,如果它們包含 lambda,則適用一些規則。
參見 JLS §15.27.2
任何使用但未在 lambda 運算式中宣告的區域變數、形式引數或例外引數必須宣告為 final 或有效 final ( §4.12.4 ),否則在嘗試使用時會發生編譯時錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349069.html
下一篇:共享檔案夾中兩個執行緒之間的同步
