java - 在具有主键的类中覆盖 equals 方法而不破坏对称性

标签 java collections overriding equals symmetry

这个问题的答案可能是“不可能的”,但无论如何让我问一下:)

假设我们有一个非常简单的 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/

相关文章:

java - 如何将 map 转换为大名单?

android - 在 Android 中覆盖 setOnCheckedChangeListener

java - 覆盖泛型方法

java - 如何为javafx面板添加边框?

java - 错误 java.lang.NoClassDefFoundError : com/mongodb/MongoClient

java - DriverManager.getConnection() 返回 null,而不是连接对象

java - 根据 Collection.toArray(T[] array) 合约将 Java 流转换为数组

oracle - 获取关联数组的键和值

java - Spring ApplicationListener 没有接收到事件

java - 一般地覆盖Java中的方法