一种用于具有在集合对象不同的equals(物理equals和逻辑等于)机制(A Mechanism

2019-06-26 15:56发布

是否有任何Equalator机制比较像,所以我可以有coparing列出了不同等号?

编辑:我的目标是当前list1.equals(列表2),检查以区分如果浅表副本或也深副本的所有对象a.equals(b)和list1.identical(列表2),检查如果只是浅拷贝与未改性上市

所有这些名单是从相同的模型。 有些是自己的副本,因此其所持有的指针指向相同的对象,和其他人都深副本,这样层次是完全复制的,因为他们有内容更新,而不只是在结构上。

我发现自己oftenly出不来list1.equals(列表2),但我需要一个机制来告诉如果两者合计副本(在相同的顺序相同的集合对象)或有时,如果逻辑副本(通过我自己的实现逻辑等于),所以名单会叫平等和对象应该实现的东西比一个== b以下。

我的问题是有没有Equalator接口,如果我重写对象等于我失去由总体上相等(一== b)比较的能力

例如,这将是很好的;

Collections.equal(l1,l2,new Equalator(){
    @Override public boolean equals(Obj1,Obj2){
          //Default lists comparison plus commparison of objects based on
          return (obj1.propertyX() == obj2.propertyX());
    }
});

和我还是可以做list1.equals(列表2),因此他们使用默认的equals(OBJ1 == obj2的),如果包含的对象是完全一样的,这将是唯一的真实。

首先操作是检查是否列表(这可能是一个更新的清单,从模型完全重新创建对象)还是等于旧列表非常有用。

第二个操作是检查是否列表(这是数据模型的旧当前版本的浅拷贝),它不会从代码中四处移动它时,它是udpdated版本包含任何超越的变化是有用的。

编辑:一个很好的例子将是具有点的名单(X,Y)。 我们应该能够知道,因为它们包含的点是一个合乎逻辑的方式等于两个列表是相等的,因为它们是完全一样的点集或等于。 如果我们能够实现这两个phyEqual和logEqual反对,并在任何物体两种方法使list.phyEqual(列表2)或list1.logEqual(列表2)

Answer 1:

你的问题并没有真正遇到清楚,至少对我来说。 如果不能正确回答这个问题,你可以重新字一点点?

在给定的收集具体类型,最等于已经实现你暗示什么。 例如:

    public boolean equals(Object o) {
        if (o == this)
            return true;

在这种情况下,这样的事情可能是有意义的。
您可以轻松地覆盖此:

    @Override
    public boolean equals(Object o) {
        if (o.getPrimaryKey() == this.getPrimaryKey()) 
            return true;
        return super().equals(o);

[应加空值测试]如果要创建标准的集合,你甚至可以匿名覆盖建设中的equals方法。

如果你想要的东西,这并不这样做,你可以自己扩展集合和覆盖任何的存在的方法做了类似的事情。

这是否帮助?



Answer 2:

逾期的答案,但也许这将是有用的人......

番石榴等价类是等价的比较比较相同。 您需要编写自己的方法比较表(有番石榴不支持该),但你可以调用该方法的各种等价-定义。

或者你可以滚你自己的界面:

interface Equalator<T> {
    boolean equals(T o1, T o2);
}

同样,你需要编写你的(简单)方法

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) {
    ...  
}

...但你可以用不同的ListEqualator实现重用。



文章来源: A Mechanism for having different equals (physical equals and logical equals) on objects in Collection