内容简介:您可以从您所指的规范中获得您的操作的无效性:A program may produce unpredictable results if it attempts to distinguish two references to equal values of a value-based class, whether directly via reference equality or indirectly via an appeal to synchronization, identity hashing,
的一些澄清.我无法想象,最后一个要点(6)应该如何与第一个一起工作
>(1)它们是final和immutable(尽管可能包含对可变对象的引用)
>(6)它们在相等时可自由替换,这意味着在任何计算或方法调用中根据equals()交换任意两个实例x和y应该不会产生行为的可见变化.
可选是这样一个类.
Optional a = Optional.of(new ArrayList<String>());
Optional b = Optional.of(new ArrayList<String>());
assertEquals(a, b); // passes as `equals` delegated to the lists
b.get().add("a");
// now bite the last bullet
assertTrue(a.get().isEmpty()); // passes
assertTrue(b.get().isEmpty()); // throws
我读错了,还是需要更准确?
更新
伊兰的答案是有道理的(他们不再平等),但让我移动目标:
... assertEquals(a, b); // now, they are still equal assertEquals(m(a, b), m(a, a)); // this will throw assertEquals(a, b); // now, they are equal, too
让我们定义一个有趣的方法m,它会做一些变异并再次撤消它:
int m(Optional<ArrayList<String>> x, Optional<ArrayList<String>> y) {
x.get().add("");
int result = x.get().size() + y.get().size();
x.get().remove(x.get().size() - 1);
return result;
}
我知道,这是一种奇怪的方法.但我想,它有资格作为“任何计算或方法调用”,不是吗?
您可以从您所指的规范中获得您的操作的无效性:
A program may produce unpredictable results if it attempts to distinguish two references to equal values of a value-based class, whether directly via reference equality or indirectly via an appeal to synchronization, identity hashing, serialization, or any other identity-sensitive mechanism . Use of such identity-sensitive operations on instances of value-based classes may have unpredictable effects and should be avoided.
(强调我的)
修改对象是一种身份敏感操作,因为它只影响具有您用于修改的引用所代表的特定标识的对象.
当你调用x.get().add(“”);您正在执行一项操作,允许识别x和y是否代表同一个实例,换句话说,您正在执行身份敏感操作.
尽管如此,我希望如果未来的JVM真正尝试替换基于值的实例,它必须排除引用可变对象的实例,以确保兼容性.如果执行生成Optional的操作,然后解压缩Optional,例如……流findAny().get(),如果中间操作允许用另一个在中间点可选用的点上相等的元素替换该元素,那将是灾难性/不可接受的(如果该元素本身不是值类型) …
翻译自:https://stackoverflow.com/questions/47528317/value-based-classes-confusion
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ES6标准入门(第3版)
阮一峰 / 电子工业出版社 / 2017-9 / 99.00
ES6是下一代JavaScript语言标准的统称,每年6月发布一次修订版,迄今为止已经发布了3个版本,分别是ES2015、ES2016、ES2017。本书根据ES2017标准,详尽介绍了所有新增的语法,对基本概念、设计目的和用法进行了清晰的讲解,给出了大量简单易懂的示例。本书为中级难度,适合那些已经对JavaScript语言有一定了解的读者,可以作为学习这门语言最新进展的工具书,也可以作为参考手册......一起来看看 《ES6标准入门(第3版)》 这本书的介绍吧!