Возможные способы сделать объект неизменным
-
06-07-2019 - |
Вопрос
Я ищу какой-нибудь эффективный способ создания неизменяемого класса, такого же, как класс String в Java.
Решение
private
и предпочтительно final
Том Хотин отметил, что final
может быть необязательным. String
class
имеет кэш hash
var, который назначается только при вызове хэш-функции.
Другие советы
Если вы заполните все поля с помощью конструктора и сделаете поля окончательными - вы уже на полпути.
Если в полях используются пользовательские типы, возможно, вам также потребуется сделать их неизменяемыми.
Любые поля, являющиеся коллекциями, должны использовать неизменяемые коллекции, чтобы быть в безопасности.
Вам нужно беспокоиться о графе объектов!
Любые методы объекта должны быть обработаны с неконечными полями. Например. String.add создает новую строку. Если вам нужно изменить одно поле - сделайте это с помощью конструктора копирования.
Наконец, сделайте объект окончательным. Р>
Объект является неизменным, если ни одно из его полей не может быть изменено, поэтому эти поля должны быть final
. Если вы не хотите, чтобы ваш объект был разделен на подклассы, вы также можете сделать сам класс final
, как это делает String.
Чтобы с легкостью создать неизменный объект с большим количеством информации, вам нужно посмотреть на шаблон фабрики р>
Дополнительную информацию см. в Википедии