Давайте предположим, что есть служба данных, которая возвращает экземпляры класса cat
:Сравнение свойств объектов, которые равны через ид
class Cat {
int id;
String name;
int iq;
}
Я хочу, чтобы держать экземпляры внутри Set<Cat>
, которые не должны занимать две кошки с тот же идентификатор. Поэтому мне нужно переопределить методы equals
и hashcode
только для проверки на id
.
Вопрос: как я могу определить, требует ли кошка внутри моего набора обновления, когда я получаю новый экземпляр из службы с тем же идентификатором, но разные значения для name
и/или iq
? Я не могу добавить свойства к equals
или hashcode
, так как тогда было бы возможно, что Set содержит экземпляры одного и того же идентификатора.
Нужно ли сравнивать все поля вручную или есть другое типичное для Java решение?
Edit для осветления:
Просто обновление Set
с новым экземпляром не будет достаточно, потому что это код запускается на обновление. Так что я хочу сделать, это:
if (set.contains(newCat)) {
Cat current = set.get(newCat);
if (!current.equals(newCat)) { //obviously this is not enough
set.add(current);
//notify EventBusses and such
}
}
Решения, которые пришли в мой ум:
current.requiresUpdate(newCat) //basically copy of equals() with properties
current.updateWith(newCat) //same as above but keeping the old instance
if (!current.name.euqals(newCat.name)) //for each property
- получить только объекты из службы, которые имеют изменилось. Оптимально, но не для меня.
Все это потребует несколько избыточного кода, поэтому я надеялся, что есть образец или коллекция, которая выполняет эту работу для меня.
Решение может включать в себя классы Guava.
Вы действительно хотите, чтобы набор не держать двух кошек с тем же ID, или вы на самом деле хотите нет двух кошек, не имеют такой же идентификатор? Если это первый, используйте «Map» и проверьте, '' map.containsKey (id) 'перед добавлением его. –
Вы можете хранить все экземпляры внутри 'Map' вместо 'Set '. Тогда вы все равно можете проверить свой метод 'equals()', кошки идентичны. Или просто напишите другой метод, который сравнивает все поля. Фактически, вы все равно должны это сделать. –
khelwood