Java对象相等

时间:2015-10-20 16:20:36

标签: java

我的项目中有四个域对象。它们有3个共同的属性,即id,name和age。

public class Domain1 {
       private String id;
       private String name;
       private int age;
       ...
}

public class Domain2 {
       private String id;
       private String name;
       private int age;
       ...
}

public class Domain3 {
       private String id;
       private String name;
       private int age;
       ...
}

public class Domain4 {
       private String id;
       private String name;
       private int age;
       ...
}

与其他域(Domain2,Domain3和Domain4)或彼此相比,Domain1和Domain4比较仅基于'id'属性。 Domain2和Domain3比较基于id,name和age,除非相互比较。

对于前,

Domain1 equal Domain2 - equality based on id
Domain1 equal Domain3 - equality based on id
Domain1 equal Domain4 - equality based on id
Domain2 equal Domain3 - equality based on id, name and attribute
Domain2 equal Domain4 - equality based on id
Domain3 equal Domain4 - equality based on id

等......

如何实现这样的平等要求?

3 个答案:

答案 0 :(得分:2)

我会尽量不这样做。您提出的规则违反了Object.equals的要求,特别是:

  

它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals(z)应返回true

现在考虑你的规则:

d2.equals(d1)

现在d1.equals(d3)为真(它们与ID匹配)且d2.equals(d3)为真(它们与ID匹配)但NSURLSessionDownloadDelegate -> URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:为false,因为它们与属性不匹配和名字。

我不记得我记得看到完全不同类型的平等很好地运作。尝试避免超类/子类关系中的意外是很难的,但这更糟糕。

答案 1 :(得分:1)

根据您的要求,您可以class::after { content: url('#SVG'); height: 10px; width: 10px; } override这四个域对象的equals()方法。 您可以通过IDE生成它并对其进行修改以满足您的要求。

编辑:在您的方法中,您可以查找要与之比较的对象的类型:

public boolean equals(Object object){
   if(object instancof Domain4) //Specific implementation
   ....
}

然而,像Jon说它会违反Object.equals的要求。

答案 2 :(得分:0)

也许我不理解这里的用例,但你可以尝试using a Comparator然后创建一个ComparableDomain接口,它有类似getType(这会返回Domain1,Domain2等)以及常见的东西。 getters / setters(用于名称,年龄和ID),您可以使所有域实现ComparableDomain。

现在,您可以先比较两个不同的Domain对象,然后再按照您的描述检查字段,然后再对它们进行比较。

public class DomainComparator implements Comparator<ComparableDomain>{

    @Override
    public int compare(ComparableDomain domain1, ComparableDomain domain2) {
        //First check domain1 and domain2 are actually ComparableDomain objects
        if(domain1.getType().equals("Domain1") && domain2.getType().equals("Domain2")){
          // Do comparison between d1 and d2
        }
        ...
        elseif(domain1.getType().equals("Domain2") && domain2.getType().equals("Domain3"){
           // Do comparison based on id, name and attribute
        }

    }

}

这可能不是很优雅,但它似乎可以解决问题。或许我只是误解了这个问题。我知道比较器通常用于排序等,但在这种情况下它可能会起作用。