2014-12-03 48 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; 
}