Добавление проверки в .equals () для другого типа значения - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть класс с несколькими полями, одно из которых - int, а 2 - long. Я собираюсь добавить чек в equals(), так что, если передан объект Integer, он будет сравнивать поле int, и, если то же самое, вернет true. Аналогично, если передано Long, если оно находится между полями 2 long, оно вернет true.

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

Является ли это хорошей или плохой идеей по сравнению с простой итерацией по всем объектам и проведением сравнений таким образом?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Не делай этого.

Метод equals() имеет четко определенный контракт, , и предлагаемая вами реализация нарушает его. Например, оно не будет симметричным ; если x является вашим объектом, а y является Integer, y.equals(x) будет ложным, даже если x.equals(y) является истинным. Нарушение этих правил приведет в замешательство любого, кто должен работать с вашим кодом - даже себя, в будущем, когда вы более привыкли использовать этот метод правильно.

Ваши варианты использования звучат так, как будто они могут быть удовлетворены с помощью NavigableMap, где ключи - целые числа, а значения - экземпляры вашего класса.

1 голос
/ 29 ноября 2011

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

Для таких случаев вы можете написать свой собственный Comparator и использовать его для поиска ваших объектов в коллекции.

Или используйте отдельный метод equals, такой как checkIntEquality и checkLongEquality, и вызывайте их соответствующим образом.

1 голос
/ 29 ноября 2011

Производительность будет такой же, но код будет запутан. Другой разработчик (или вы сами через пару месяцев) просто ожидаете, что equals() проверит, равен ли объект .

Я бы пошел к более явному решению.

0 голосов
/ 29 ноября 2011

Это имеет смысл, только если семантика объекта следует той же логике.

Если разные типы представляют разные значения с разными значениями, этот тип перегрузки вызывает путаницу.

Звучит так же, как "равно" для длинных, даже не равно, что хуже.

Инкапсулировать поведение в объекте хорошо, но его следует разумно назвать.

...