#java #comparable #value-objects
#java #сопоставимый #объекты значений
Вопрос:
Я исследую объекты значений Java в образовательных целях.
Чего я не понимаю, так это почему никто не упоминает (на одном дыхании), что объекты значений Java реализуют Comparable?
Если объекты значений Java должны иметь «правильный» хэш-код и равны по соображениям равенства, почему они также не должны иметь сопоставимый метод compareTo?
Вот мой мыслительный процесс. Экземпляры объектов значений будут проверены на равенство, поэтому для них требуется правильное значение equals / hashcode. Объекты значений могут храниться в коллекциях «hash», опять же, требуется метод Hashcode. Так почему бы не добавить в Comparable, чтобы они могли быть ключами в упорядоченных коллекциях?
Комментарии:
1. почему они должны реализовывать
compareTo
метод?2. Есть ли у вас ссылка на определение объектов значений, которые вы используете в настоящее время? Однако ваш вопрос звучит почти так: «Почему люди, которые определили эту концепцию, не включили в нее эту другую концепцию», и на эти вопросы может быть сложно, если вообще возможно, ответить, не имея возможности напрямую задать вопрос оригинальным авторам.
Ответ №1:
Я думаю, что основная причина заключается в том, что для любого указанного вами объекта значения действительно существует одно и только одно определение равенства, тогда как может быть несколько способов упорядочить его экземпляры. Уникальное определение равенства требует переопределения equals()
(если значения по умолчанию недостаточно). Как только вы это сделаете, вам необходимо предоставить соответствующую hashCode()
реализацию по всем причинам, указанным в документации.
Однако вам не нужно реализовывать Comparable
для упорядочивания экземпляров класса объекта значения, и, вероятно, вам не следует этого делать, если вы собираетесь упорядочивать их несколькими способами. Достаточно просто передать анонимную встроенную Comparator
реализацию методу сортировки с разными реализациями компаратора для разных порядков. Это проще, чем когда-либо со времен Java 8 и лямбд. В последние годы я сам уклонялся от реализации Comparable
именно по этой причине.
Конечно, если для вашего конкретного класса объектов значения действительно существует естественный порядок, то обязательно реализуйте Comparable
. В этом случае убедитесь, что оно соответствует вашей equals()
реализации.