基于值的类混淆更新
我正在寻求对基于值的类的定义进行一些澄清。我无法想象,最后一个要点(6)应该如何与第一个要点一起工作
- (1)它们是最终的和不可变的(尽管可能包含对可变对象的引用)
- (6)它们在相等时可以自由替换,这意味着在任何计算或方法调用中根据 equals() 交换任何两个相等的实例 x 和 y 应该不会产生明显的行为变化。
Optional
就是这样一类。
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
是我读错了,还是需要更精确?
更新
Eran的答案是有道理的(它们不再相等),但让我移动目标:
...
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;
}
这是奇怪的方法,我知道。但我想,它有资格被称为“任何计算或方法调用”,不是吗?