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