Здравствуйте, Aleksei_Lekomtsev, Вы писали:
vsb>>Надо реализовать методы equals и hashCode.
A_L>Возможно еще сделать объект immutable
В идеале — да. Или, по-современному — record. Ещё есть тонкий момент — List, который передали в конструкторе, вызывающий может потом решить поменять. Поэтому с какой-то точки зрения правильно бы его скопировать, а не просто ссылку сохранить. С другой точки зрения возможно, что в 100% случаев его никто менять не будет и будет пустое копирование, которое просто замедляет программу ради борьбы с призрачной угрозой. Я даже не знаю, как в таких случаях поступать. В идеале бы в языке должны быть отдельные интерфейсы для иммутабельных структур, но в жаве что-то не додумались до сих пор.
Re[4]: Чем плох объект в качестве ключа для HashMap?
Здравствуйте, vsb, Вы писали:
vsb>В идеале — да. Или, по-современному — record. Ещё есть тонкий момент — List, который передали в конструкторе, вызывающий может потом решить поменять. Поэтому с какой-то точки зрения правильно бы его скопировать, а не просто ссылку сохранить. С другой точки зрения возможно, что в 100% случаев его никто менять не будет и будет пустое копирование, которое просто замедляет программу ради борьбы с призрачной угрозой. Я даже не знаю, как в таких случаях поступать. В идеале бы в языке должны быть отдельные интерфейсы для иммутабельных структур, но в жаве что-то не додумались до сих пор.
Да, в идеале data class котлина + его иммутабл List.
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, Aleksei_Lekomtsev, Вы писали:
vsb>>>Надо реализовать методы equals и hashCode.
A_L>>Возможно еще сделать объект immutable
vsb>В идеале — да. Или, по-современному — record. Ещё есть тонкий момент — List, который передали в конструкторе, вызывающий может потом решить поменять. Поэтому с какой-то точки зрения правильно бы его скопировать, а не просто ссылку сохранить. С другой точки зрения возможно, что в 100% случаев его никто менять не будет и будет пустое копирование, которое просто замедляет программу ради борьбы с призрачной угрозой. Я даже не знаю, как в таких случаях поступать. В идеале бы в языке должны быть отдельные интерфейсы для иммутабельных структур, но в жаве что-то не додумались до сих пор.
То есть если правильно понял, добавляем final для полей и параметров конструктора(хотя может это и не обязательно), удаляем сеттеры и геттер для listProperty, listProperty инициализируем в конструкторе копированием — new ArrayList<>(oldList)
Re[5]: Чем плох объект в качестве ключа для HashMap?
Здравствуйте, Aleksei_Lekomtsev, Вы писали:
A_L>То есть если правильно понял, добавляем final для полей и параметров конструктора(хотя может это и не обязательно), удаляем сеттеры и геттер для listProperty, listProperty инициализируем в конструкторе копированием — new ArrayList<>(oldList)
Для параметров final не нужен.
Если нужен геттер для списка, то надо инициализировать примерно как Collections.unmodifiableList(new ArrayList(oldList)). Такой список можно наружу отдать и его не смогут поменять.
Re[5]: Чем плох объект в качестве ключа для HashMap?
Собственно все зависит от задачи. Вообще, чаще всего объекты лучше в хешмапы в качестве ключа вообще не пихать. А если пихать, то только
иммутабельные. Но в некоторыз задачах (каких, я не вспомню уже, помню что были, кажется интерпретация AST дерева или трансформация дерева) было вполне допустимо у меня пихать именно объект и было пофиг на хешкод, ибо важно был именно сам инстанс объекта, а не его значения.
Соответственно нужно тупо понимание что ты делаешь и для чего.