我的项目中有四个域对象。它们有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
等......
如何实现这样的平等要求?
答案 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
}
}
}
这可能不是很优雅,但它似乎可以解决问题。或许我只是误解了这个问题。我知道比较器通常用于排序等,但在这种情况下它可能会起作用。