这个问题的答案可能是“不可能的”,但无论如何让我问一下:)
假设我们有一个非常简单的 JAVA 类,它有一个主键,例如:
class Person {
String ssid;
String name;
String address;
...
}
现在,我想将人存储在一个集合中,这意味着我将不得不重写 equals 方法。这不是一件完全微不足道的事情,但在光秃秃的基础上,我会有一些类似的东西:
@Override
public boolean equals (Object other) {
if(other==this) return true;
if(!other.getClass().equals(this.getClass()) return false;
Person otherPerson = (Person)other;
if(this.ssid.equals(otherPerson.getSsid()) return true;
}
请原谅任何明显的错误,只是我脑子里打出来的。现在,假设稍后在应用程序中我有一个通过用户输入获得的 ssid。如果我想将我的 ssid 与一个人进行比较,我将不得不调用如下内容:
String mySsid = getFromSomewhere();
Person myPerson = getFromSomewhere();
if(myPerson.equals(new Person(mySsid)) doSomething();
这意味着我必须创建一个方便的构造函数来创建一个基于 ssid 的 Person(如果我还没有),而且它也非常冗长。简单地调用会更好
myPerson.equals(mySsid)
但是,如果我向我的 Person 等于类添加一个字符串比较,那将破坏对称属性,因为 String 不知道如何将自己与 Person 进行比较。
最后,一个大问题,有没有什么方法可以使用覆盖的 equals 方法来启用这种“速记”比较,并且不会破坏对称规则?
感谢您对此的任何想法!
编辑:澄清一下,这更像是一个悬而未决的问题,而不是寻求精确解决方案的问题。当我想从集合中提取一个人时,equals 应该适合这种情况。所以应该可以做这样的事情:
List<Person> people = ...
people.get(ssid);
能够基于主键在类上定义相等性似乎显而易见且直观,但我还没有找到一种直接的方法来做到这一点。
最佳答案
更好的办法是将您的人员存储在 map 中,然后您可以轻松检索它们:
HashMap<String, Person> people = new HashMap<String, Person>();
Person p = constructPersonFromStuff();
people.put(p.ssid, p);
然后,您可以查看此人是否存在:
String ssid = getFromSomewhere();
if(people.contains(ssid)){
Person thatGuy = people.get(ssid);
}else{
//that person DOESN'T EXIST! HE'S A FIGMENT OF YOUR IMGAINATION!
}
关于java - 在具有主键的类中覆盖 equals 方法而不破坏对称性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766855/