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

У меня есть абстрактный класс объектов, который реализует 3 немного разных объекта. В моих 3 подклассах я переопределил методы equals и has, но вопрос в том, должен ли я также делать это в абстрактном объекте? Если я этого не сделаю, я не смогу сравнивать сущности, которые определяются только абстрактной сущностью, если я их не приведу. Если я сделаю равные, рискну ли я сравнить разные подсущности и получить, что они похожи?

Пример:

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
        }
    }

person Marthin    schedule 20.10.2011    source источник


Ответы (1)


Я не вижу проблемы с кастингом. Тип аргумента для равенства — Object, поэтому вам все равно придется выполнять приведение типов, чтобы иметь доступ к атрибутам.

Если вы определяете метод equals в каждом подклассе, когда возникает ситуация, когда вызывается equals в абстрактном суперклассе?

Если я сделаю равные, рискну ли я сравнить разные подсущности и получить, что они похожи?

В любом случае вы рискуете сравнивать разные субсущности друг с другом. Просто представьте себе Set с суперклассом как тип, заполненный объектами, которые являются двумя экземплярами двух разных подклассов. Это не имеет большого отношения к тому, переопределяете ли вы равные в суперклассе или нет.

В вашем примере метод 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);
person Mikko Maunu    schedule 20.10.2011
comment
Я добавил пример моей ситуации - person Marthin; 20.10.2011
comment
Также в вашем примере не будет вызываться метод equals в журнале абстрактного класса, если метод equals переопределен в подклассе. Это не имеет большого отношения к тому, являются ли классы в этой иерархии сущностями или нет, просто простое переопределение метода. - person Mikko Maunu; 20.10.2011