gpt4 book ai didi

java-8 - 为什么我不应该在 Java8 中对 Optional 使用基于身份的操作?

转载 作者:行者123 更新时间:2023-12-04 14:57:44 29 4
gpt4 key购买 nike

java.util.Optional 的 javadoc指出:

This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.



但是,这个junit 代码段是绿色的。为什么?它似乎与 javadoc 相矛盾。
    Optional<String> holder = Optional.ofNullable(null);
assertEquals("==", true, holder == Optional.<String>empty());
assertEquals("equals", true, holder.equals(Optional.<String>empty()));

最佳答案

您不应该从在特定实现下运行的一个简单测试的观察行为得出任何结论。规范说你不能依赖这种行为,因为 API 设计者保留随时更改行为的选项,恕不另行通知。

术语 Value-based Class已经提供了有关预期选项的提示。当使用相同值重复调用时, future 版本或替代实现可能会返回相同的实例,或者 JVM 可能会实现基于身份的操作对其没有意义的真值类型。

这类似于装箱返回的实例 valueOf包装器类型的方法。除了为某些(小)值提供保证外,未指定是创建新实例还是为相同的值返回相同的实例。

“如果程序试图区分对基于值的类的相等值的两个引用,它可能会产生不可预测的结果……”也可能暗示引用比较的结果可能会在两个基于值的类实例的生命周期内发生变化。想想重复数据删除功能。由于JVM内部已经有这样的特性char[] String 的数组s,将此功能扩展到“基于值的类”的所有实例的想法并不是那么牵强。

关于java-8 - 为什么我不应该在 Java8 中对 Optional 使用基于身份的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487753/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com