Объекты JPA и метод equals для абстрактной сущности

#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 переопределен в подклассе. Это не имеет слишком большого отношения к классам в этой иерархии сущностей или нет, просто простое переопределение метода.