微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 java.util.function.Function 定义为 static final

如何解决将 java.util.function.Function 定义为 static final

在我的代码中,我们必须将欧元转换为欧分:将 BigDecimal 作为输入,我们必须将其乘以 100。

我们需要多次应用此转换,因此我们决定使用 UnaryOperator 中的 java.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) 以避免多线程环境中的数据不一致(线程安全)会不会很危险?

解决方法

不,这并不危险。

如果你创建一个可变对象并将它放在一个静态字段中,那么不同的线程可能会改变它的状态并导致麻烦。

虽然这里静态 final 字段持有对 lambda 的引用,但没有什么是可变的。它没有任何可以被多个线程篡改的状态。 BigDecimal 上的每个操作都是线程安全的,BigDecimal 是不可变的。即使 BigDecimal 不是线程安全的,其他线程也无法访问传递给 lambda 的参数。

顺便说一句,如果您使用局部变量实现 lambda,那仍然是线程安全的,唯一的状态仅限于执行该方法的堆栈帧。

考虑一下,如果您要将这个 lambda 放在一个变量中并在不同的地方使用它,您不妨使用静态方法。你没有得到任何使它成为 lambda 的东西。如果您需要将它作为参数传递,您仍然可以使用方法引用来实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。