簡體   English   中英

在 Java 中使用 final in 方法參數

[英]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中幾乎所有可能的地方都使用它的基本思想。通常它用於不會改變的變量。 那么,您能否解釋一下常用用法的概念?

  1. 是否需要在類和接口的方法參數中使用 final 關鍵字?

沒有任何。 因為使用它的效果微乎其微。

  1. 據我所知,它也有利於線程安全

一點也不。 原始參數的更改在方法主體之外是可見的。 另一方面, final不會阻止您對引用類型參數調用方法

換句話說:如果你的方法主體做了一些最終導致不同線程之間競爭條件的事情,那么final根本沒有幫助。

使用final作為參數的唯一絕對阻止您做的事情:重新為其分配值。 因此,它可以幫助防止愚蠢的錯誤。 但它幾乎歸結為純粹的風格。 以我為例,我幾乎從不使用它,並且大部分時間都認為它是無用的雜亂/噪音。

  1. 在方法參數上使用 final 修飾符沒有多大意義,因為它會給方法聲明增加視覺上的混亂,而不會花太多錢。 只要您可以確保不會將值重新分配給這些變量,您就可以在方法參數上不使用 final 修飾符。
  2. 方法參數位於堆棧上,並且對於該特定線程而言是本地的,只要該線程不將其發布到其他線程。 由於它不在其他線程之間共享,因此這里不會出現線程安全問題。 但是,如果當前線程發布了這些參數,那么您就不走運了,並且使用 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 字段語義的更多詳細信息。

這通常是不必要的,除非該對象在多個地方被引用。

1.類和接口的方法參數中是否需要使用final關鍵字?

這取決於這些方法的作用。 例如,如果它們包含 lambda,則適用一些規則。

參見 JLS §15.27.2

任何使用但未在 lambda 表達式中聲明的局部變量、形式參數或異常參數必須聲明為 final 或有效 final ( §4.12.4 ),否則在嘗試使用時會發生編譯時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM