Возможные способы сделать объект неизменным

StackOverflow https://stackoverflow.com/questions/1017140

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

<Ол>
  • Все поля должны быть private и предпочтительно final
  • Убедитесь, что класс не может быть переопределить - сделать финал класса, или использовать статические фабрики и держать частные конструкторы
  • Поля должны быть заполнены из Конструктор / Factory
  • Не предоставляйте сеттеры для Поля
  • Следите за коллекциями. использование <Код> Collections.unmodifiable * . Кроме того, коллекции должны содержать только неизменяемые объекты
  • Все добытчики должны предоставить неизменяемые объекты или используйте защитное копирование
  • Не предоставляйте методы, которые изменить внутреннее состояние Объект.
  • Том Хотин отметил, что final может быть необязательным. String class имеет кэш hash var, который назначается только при вызове хэш-функции.

    Другие советы

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

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top