Сравнение двух объектов, которые реализуют один и тот же интерфейс для равенства / эквивалентности - Справка по проектированию - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть интерфейс и два объекта, реализующих этот интерфейс, упрощенно;

public interface MyInterface {
    public int getId();
    public int getName();
    ...
}

public class A implements MyInterface {
    ...
}

public class B implements MyInterface {
    ...
}

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

Как бы вы поступили об этом?

Map<String, MyInterface> oldGeneratedObjects = getOldGeneratedObjects();
Map<String, MyInterface> newGeneratedObjects = getNewGeneratedObjects();

// TODO: Establish that for each Key the Values in the two maps return equivalent values.

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

Было бы целесообразно / возможно / рекомендовано переопределить равно или реализовать Comparable?

Заранее спасибо,

Gavin

1 Ответ

2 голосов
/ 16 апреля 2010

Я бы реализовал пользовательскую версию equals в тестовом классе, а не внутри какого-либо из этих классов реализации (поскольку это противоречило бы обычному equals контракту). Что-то вроде:

boolean equals(A a, B b) ...

Я понимаю, что эта проверка потребуется только в течение периода миграции, поэтому на обычные equals методы каждой реализации это не должно повлиять. А именно, A.equals должен возвращать true только для равного экземпляра A и всегда должен возвращать false для экземпляра B. И наоборот.

После завершения миграции вам больше не нужен ни класс A, ни класс тестера, и вы можете продолжать использовать класс B, не касаясь его реализации.

Обратите внимание, что если MyInterface (или A и B) расширяет Comparable, вам также следует проверить, что реализации в A и B эквивалентны.

(И вы наверняка знаете, что если вы реализуете equals, вы должны также реализовать hashCode.)

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