Реализация equals (): сравнить с реализованным интерфейсом или реализующим классом?

Мне было интересно, как лучше всего реализовать equals () для семейства классов, которые все реализуют один и тот же интерфейс (и клиент должен работать только с указанным интерфейсом и никогда не знать о реализации классов)

Я не придумал свой собственный конкретный пример, но в JDK есть два примера - java.lang.Number и java.lang. CharSequence, которые иллюстрируют решение:

boolean b1 = new Byte(0).equals( new Integer(0) ) );

или с CharSequence

boolean b2 = "".equals(new StringBuilder());

В идеале вы хотите, чтобы они оценивались как истинные или нет? Оба типа реализуют один и тот же интерфейс типа данных, и как клиент, работающий с экземплярами Numbers (соответственно CharSequences), я было бы легче, если бы equals сравнивали типы интерфейсов в объявление реализующих типов.

Это не идеальный пример, поскольку JDK предоставляет публике реализующие типы, но предположим, что нам не нужно было поддерживать совместимость с тем, что уже есть - с точки зрения дизайнеров: Должна ли проверка на равенство по интерфейсу или лучше так, как она есть, проверка по реализации?


Примечание: я понимаю, что проверка на равенство по интерфейсу может быть очень сложной для правильной реализации на практике, что даже усложнило , поскольку одинаковые интерфейсы также должны возвращать один и тот же hashCode (). Но это только препятствия в реализации, например, CharSequence, хотя интерфейс довольно мал, все необходимое для проверки равенства присутствует без раскрытия внутренней структуры реализации (так что принципиально возможно реализовать должным образом, даже , не зная заранее о будущих реализациях). Но меня больше интересует аспект дизайна , а не то, как его на самом деле реализовать. Я бы не стал принимать решение, основываясь исключительно на том, насколько сложно что-то реализовать.

8
задан Durandal 12 August 2011 в 17:07
поделиться