这个问题的答案可能是“不可能的”,但无论如何让我问一下:)
假设我们有一个非常简单的 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 equals 类添加了一个字符串比较,那会破坏对称属性,因为 String 不知道如何将自己与 Person 进行比较。
所以最后,最大的问题是,有没有办法使用覆盖的 equals 方法启用这种“速记”比较,而不破坏对称规则?
感谢您对此的任何想法!
编辑:澄清一下,这更像是一个悬而未决的问题,而不是寻求确切解决方案的问题。当我想从集合中提取一个 Person 时,equals 应该满足这种情况。所以应该可以做这样的事情:
List<Person> people = ...
people.get(ssid);
能够基于主键在类上定义相等性似乎是显而易见且直观的,但我还没有找到一种直接的方法来做到这一点。