2014-12-03 50 views
1

我必须错过Equivalence.wrap()的一些东西,但是下面的测试对我来说是失败的 - 只在最后一行使用番石榴18.0。为什么?我究竟做错了什么?我的目标是通过将等效对象添加到一个集合中来删除等效对象。如何使用Equivalence.wrap()来重复数据删除?

@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

如果你的Equivalence没有正确实现散列,你会得到这种行为。没有看到更多的代码,我不能提出更具体的东西,但几乎可以肯定发生了什么。

+0

你是正确的!我的'Equivalence.doHash()'impl不满足可分配的属性。即'doHash(p1)!= doHash(p2)' - 不正确。 – Nikita 2014-12-03 18:50:19

0

如果我是你,我尝试(在等价类例如EqualsEquivalence从的javadoc)在您的测试使用这个类:

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; 
}