如何使用Equivalence.wrap()重复数据集?

时间:2014-12-03 18:13:12

标签: java guava

我必须遗漏一些关于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
    }

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