繁体   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