我正在寻求对基于 Value-based Classes 的定义的一些澄清。我无法想象,最后一个要点 (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;
}
这是一种奇怪的方法,我知道。但我想,它符合“任何计算或方法调用”的条件,不是吗?