簡體   English   中英

將 java.util.function.Function 定義為 ZA81259CEF8E5559C6297DF1D4

[英]Defining java.util.function.Function as static final

在我的代碼中,我們必須將歐元轉換為歐分:將BigDecimal作為輸入,我們必須將其乘以 100。

我們需要多次應用這種轉換,所以我們決定使用來自UnaryOperatorjava.util.function

private static final UnaryOperator<BigDecimal> CONVERT_EURO_TO_CENTS =
        input -> input.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN);

然后我們使用CONVERT_EURO_TO_CENTS如下:

[.....]

    CONVERT_EURO_TO_CENT.apply(<aBigDecimal>)

[.....]

UnaryOperator聲明為常量( static final )會很危險,從而避免多線程環境中的數據不一致(線程安全)?

不,這並不危險。

如果您制作一個可變的 object 並將其放在 static 字段中,則不同的線程可以更改其 state 並引起麻煩。

雖然 static 最終字段包含對 lambda 的引用,但這里沒有什么是可變的。 它沒有任何多線程可以篡改的 state。 BigDecimal 上的每個操作都是線程安全的,BigDecimal 是不可變的。 即使 BigDecimal 不是線程安全的,其他線程也無法訪問傳遞給 lambda 的參數。

順便說一句,如果您使用局部變量實現 lambda ,那仍然是線程安全的,唯一的 state 僅限於執行該方法的堆棧幀。

考慮一下如果您要將這個 lambda 放在一個變量中並在不同的地方使用它,您不妨使用 static 方法。 你沒有得到任何使這成為 lambda 的東西。 如果您需要將其作為參數傳遞,您仍然可以使用方法引用來執行此操作。

暫無
暫無

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

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