#jpa #equals #abstract #entities
#jpa #равно #абстрактный #сущности #аннотация
Вопрос:
У меня есть абстрактный класс сущностей, который реализует 3 немного разных объекта. В моих 3 подклассах я переопределил методы equals и has, но вопрос в том, должен ли я также делать это в абстрактной сущности? Если я этого не сделаю, я не смогу сравнивать объекты, которые определяются только абстрактной сущностью, если я их не приведу. Если я сделаю equals, я рискну сравнить с разными вложенными объектами и получу, что они похожи?
Пример:
abstract class Log{}
SystemLog extends Log{}
UserLog extends Log{}
public void test(Log log){
Log myInner = new SystemLog();
if(log.equals(myInner)){
//do random stuff
}
}
Ответ №1:
Я не вижу проблемы с приведением. Тип аргумента для equals — Object , поэтому вам все равно нужно приводить, чтобы иметь доступ к атрибутам.
Если вы определяете метод equals в каждом подклассе, когда возникает ситуация, когда вызывается equals в абстрактном суперклассе?
Если я сделаю equals, я рискну сравнить с разными вложенными объектами и получу, что они похожи
В любом случае вы рискуете сравнивать разные сущности друг с другом. Просто представьте набор с суперклассом в качестве типа, заполненного объектами, которые являются двумя экземплярами двух разных подклассов. Это не имеет особого отношения к тому, переопределяете ли вы equals в суперклассе или нет.
В вашем примере метод equals, возможно, реализованный в абстрактном классе Log, не будет вызываться, если у нас уже есть реализация в реальном подклассе:
Предполагая:
UserLog extends Log{
public boolean equals(Object o) {
//I do override equals method so I am one who is called.
//and here you go and check type with something like
if (this == o) return true;
if (!(o instanceof UserLog)) return false;//accepts subclasses of UserLog
....
}
...
}
//And then somewhere else
Log ul = new UserLog();
test(ul);
Комментарии:
1. Я добавил пример моей ситуации
2. Также в вашем примере метод equals в журнале абстрактного класса не будет вызываться, если метод equals переопределен в подклассе. Это не имеет слишком большого отношения к классам в этой иерархии сущностей или нет, просто простое переопределение метода.