Равный и хеш-код в унаследованном классе - PullRequest
1 голос
/ 28 июля 2010

В моем понимании приведенная ниже реализация equ и hashcode безопасна, поскольку правильный метод в производном классе будет вызывать (вместо parent), даже если я вызываю его через указатель parent.При условии, что родительский объект рассматривается как абстрактный класс (используется в JPA - базовый класс hiberante).Пожалуйста, подтвердите это предположение на основе приведенного ниже примера.

@Entity
@Inheritance
class A {
String type;
}

@Entity
class B extends A {
String uniqueName;
.......

@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

@Entity
class C extends A {
String uniqueName;
.......
@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

class D {
A a;
String name;
}

Поскольку A может принимать экземпляр как B, так и C, при написании метода равенства / хэширования для D, все ли в порядке с вышеуказанной реализациейв B & C, а не в A).не было бы случая, когда A был создан непосредственно (new A).

спасибо.

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Вы спрашиваете, можно ли писать хеш-код и равнозначны методам в производном классе, где непосредственный суперкласс не реализовал их?

Если вы скажете, что класс A никогда не будет создан напрямую, почему бы не объявить A абстрактным, тогда проблем не будет.

1 голос
/ 29 июля 2010

В моем понимании ниже реализация равенства и хэш-кода безопасны как правильный метод в производный класс будет вызывать (вместо родитель), даже если я позвоню через родительский указатель.

Вы просите полиморфизм? Если вы сделаете: да, то какой метод вызывается, зависит от типа времени выполнения, а не от типа ссылки. Пока ваши объекты типа B или C. Все в порядке.

0 голосов
/ 29 июля 2010

Я думаю, что ваш пример кода неполон, потому что я подозреваю, что вы спрашиваете, что если метод d.equals() использует a.equals(), то какая версия метода equals() вызывается?

Если это то, что вы спрашиваете, тогда ответом будет equals() метод типа a. Если a является B, то будет вызываться B.equals(). Если a является C, то вызывается C.equals(). Это верно независимо от того, имеет ли A собственную реализацию метода equals() или нет.

Поскольку вы упомянули Hibernate, я полагаю, вы пытаетесь создать сопоставление объединенного подкласса или что-то подобное. Если вы отобразите его правильно, то Hibernate не будет пытаться создать экземпляр A напрямую, который в любом случае должен быть абстрактным, так как вы это описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...