ответ на этот вопрос, вероятно, "невозможен", но позвольте мне спросить независимо от этого:)
Предполагается, что у нас есть очень простой класс 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();
Это означает, что мне нужно создать удобный конструктор для создания Person на основе ssid (если у меня его еще нет), и это также довольно многословно. Было бы гораздо приятнее просто позвонить
myPerson.equals(mySsid)
но если бы я добавил сравнение строк в свой класс Person equals, это нарушило бы свойство симметрии, поскольку строка не имела понятия о том, как сравнивать себя с Person.
Итак, наконец, главный вопрос, есть ли способ разрешить такого рода «стенографические» сравнения, используя метод переопределенных равных, без нарушения правила симметрии?
Спасибо за любые мысли по этому поводу!
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, это больше открытый вопрос, чем проблема, которая ищет точное решение. Равные должны обслуживать случаи, когда я хочу извлечь человека из коллекции. Так что должно быть возможно сделать что-то вроде этого:
List<Person> people = ...
people.get(ssid);
Казалось бы, очевидно и интуитивно понятно определить равенство в классе на основе первичного ключа, но я не нашел простого способа сделать это.