[英]Using final in method parameters in Java
作為新切換到 Java 的用戶,我意識到在我們的項目和其他一些 Java 項目中, final
關鍵字是常用的,並且在閱讀了幾個教程和 SO 線程之后,例如在 Java 中過度使用“final”關鍵字,我認為有一些例子不需要final
關鍵字。 所以,這是我感到困惑的幾點:
1 、類和接口的方法參數中是否需要使用final
關鍵字? 因為
CompanyDTO findByUuid(final UUID uuid);
//or
@Override
public CompanyDTO findByUuid(final UUID uuid) {
//...
}
2.據我所知,它對線程安全也有好處,但我需要了解為什么在Java中幾乎所有可能的地方都使用它的基本思想。通常它用於不會改變的變量。 那么,您能否解釋一下常用用法的概念?
- 是否需要在類和接口的方法參數中使用 final 關鍵字?
沒有任何。 因為使用它的效果微乎其微。
- 據我所知,它也有利於線程安全
一點也不。 對原始參數的更改在方法主體之外是不可見的。 另一方面, 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 字段語義的更多詳細信息。
這通常是不必要的,除非該對象在多個地方被引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.