我必须遗漏一些关于Equivalence.wrap()
的内容,但以下测试对我来说失败了 - 仅在最后一行使用guava 18.0。为什么?我究竟做错了什么?我的目标是通过将等效对象添加到集合来对其进行重复删除。
@Test
public void testEquivalenceWrap()
{
final Equivalence<Program2> eq = EquivalentIfIDsEven.INSTANCE;
Program2 p1 = new Program2();
p1.setId(2L);
Program2 p2 = new Program2();
p2.setId(4L);
//sanity-test equivalence impl
assertFalse(p1.equals(p2));
assertTrue(eq.equivalent(p1, p2));
assertTrue(eq.wrap(p1).equals(eq.wrap(p2)));
//dedupe in set
final Set<Equivalence.Wrapper<Program2>> set = new HashSet<>();
set.add(eq.wrap(p1));
set.add(eq.wrap(p2));
assertEquals(1, set.size()); //FAIL: size == 2
}
答案 0 :(得分:0)
如果您的Equivalence
未正确实施散列,则会出现此行为。在没有看到更多代码的情况下,我无法提出更具体的建议,但这几乎肯定是在发生什么。
答案 1 :(得分:0)
如果我是你,我会尝试在你的测试中使用这个类(来自等价类中javadoc的EqualsEquivalence):
static final class EquivalentIfIDsEven extends Equivalence<Program2>
implements Serializable {
static final EquivalentIfIDsEven INSTANCE = new EquivalentIfIDsEven();
@Override protected boolean doEquivalent(Program2 a, Program2 b) {
return a.equals(b);
}
@Override protected int doHash(Program2 o) {
return o.hashCode();
}
private Program2 readResolve() {
return INSTANCE;
}
private static final long serialVersionUID = 1;
}