Возможные способы сделать объект неизменным - PullRequest
1 голос
/ 19 июня 2009

Я ищу какой-нибудь эффективный способ создания неизменяемого класса, такой же, как класс String в Java.

Ответы [ 3 ]

8 голосов
/ 19 июня 2009
  1. Все поля должны быть private и предпочтительно final
  2. Убедитесь, что класс не может быть переопределить - сделать финал класса, или использовать статические фабрики и держать Конструкторы частные
  3. Поля должны быть заполнены из Конструктор / Factory
  4. Не предоставлять сеттеры для поля
  5. Остерегайтесь коллекций. использование Collections.unmodifiable*. Также коллекции должны содержать только неизменяемые объекты
  6. Все добытчики должны предоставить неизменяемые объекты или используйте защитное копирование
  7. Не предоставляйте никаких методов, которые изменить внутреннее состояние Объект.

Tom Hawtin указал, что final может быть необязательным. String class имеет кэш hash var, который назначается только при вызове хэш-функции.

1 голос
/ 19 июня 2009

Если вы заполните все поля с помощью конструктора и сделаете поля окончательными - вы уже на полпути.

Если поля используют пользовательские типы - возможно, вам также потребуется сделать их неизменяемыми.

Любые поля, являющиеся коллекциями, должны использовать неизменяемые коллекции - чтобы быть в безопасности.

Вам нужно беспокоиться о графе объектов!

Любые методы на объекте должны быть обработаны с неокончательными полями. Например. String.add создает новую строку. Если вам нужно изменить одно поле - сделайте это с помощью конструктора копирования.

Наконец, сделайте объект окончательным.

1 голос
/ 19 июня 2009

Объект является неизменным, если ни одно из его полей не может быть изменено, поэтому эти поля должны быть final. Если вы не хотите, чтобы ваш объект был разделен на подклассы, вы можете также сделать сам класс final, как это делает String. Чтобы легко построить неизменный объект с большим количеством информации, вы должны взглянуть на Factory Pattern

Для получения дополнительной информации см. Википедия

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