Pascal4eg / Java

 Java | Фишки и трюки

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