Immutable Classes (неизменяемые классы)
Неизменяемость — это характеристика объектов Java, которая делает их неизменными для будущих изменений после их инициализации. Его внутреннее состояние невозможно никак изменить. Чтобы изменить состояние, мы должны создать новую копию такого объекта с предполагаемыми изменениями.
Возьмем пример класса java.lang.String, который является неизменяемым классом. После создания строки мы не сможем изменить содержимое этой строки. Каждый общедоступный API в классе String возвращает новую строку с измененным содержимым. Исходная строка всегда остается неизменной.
Рекомендации по созданию неизменяемых классов:
- Не определять сеттеров. Сеттеры предназначены для изменения состояния объекта, которое мы здесь хотим предотвратить.
- Сделайте все поля final и private. Поля, объявленные private, не будут доступны за пределами класса, и если сделать их final, мы не сможем изменить их даже случайно.
- Не позволяйте подклассам переопределять методы. Самый простой способ — объявить класс как final. final классы не могут быть расширены.
- Особое внимание "неизменяемым классам с изменяемыми полями". Всегда помните, что поля-члены могут быть либо изменяемыми, либо неизменяемыми. Значения неизменяемых членов (примитивы, классы-обёртки, строки и т. д.) могут быть безопасно возвращены из геттеров. Для изменяемых членов (POJO, коллекций и т. д.) мы должны скопировать содержимое в новый объект перед возвратом из геттера.
Некоторые неизменяемые классы из JDK:
- 👉 String
- 👉 Integer, Long, Double и другие обёртки
- 👉 BigInteger, BigDecimal
- 👉 enum
- 👉 record
- 👉 LocalDate, LocalTime и другие классы Java 8 Date Time API