24.03.2025
5 минут чтения

Immutable объекты в Java: что это и как их создать?

Immutable об'єкти у Java

Immutable (неизменяемые) объекты играют важную роль в программировании, поскольку они помогают избегать ошибок, связанных с изменением состояния объектов, а также делают код более предсказуемым и безопасным для многопоточных программ.

Представьте, что у вас есть банковская карта: номер карты, имя владельца и срок действия остаются неизменными после выпуска. Если вам нужно обновить какую-либо информацию, вам придется получить новую карту. Точно так же работают immutable объекты в Java: после создания они больше не изменяются.

Хотите освоить профессию Java Developer? Присоединяйтесь к программе «От 0 до Strong Java Junior за 12 месяцев». Воспользуйтесь выгодным предложением от FoxmindEd!
Зарегистрироваться

Immutable объекты в Java

Immutable (неизменный) объект — это объект, состояние которого нельзя изменить после создания. Если нужно изменить его данные, создается новый объект с обновленными значениями.

В Java типичным примером immutable класса является String:

String str1 = "Hello";

String str2 = str1.concat(" World"); // создается новый объект

System.out.println(str1); // "Hello"

System.out.println(str2); // "Hello World"

Метод concat() не изменяет сам str1, а создает новую строку. Это и есть ключевая идея immutable объектов.

Особенности immutable объектов

  • Потокобезопасность: Immutable объекты не изменяются, поэтому их можно безопасно использовать в многопоточной среде без необходимости синхронизации.
  • Использование в хеш-таблицах: Поскольку hashCode() у immutable объекта всегда остается неизменным, такие объекты идеально подходят для использования в ключах HashMap или HashSet.
  • Оптимизация кэширования (String pool): Класс String в Java использует пул строк для уменьшения количества создаваемых объектов и повышения производительности.

Как создать immutable объект в Java?

Чтобы создать immutable объект в Java, нужно придерживаться нескольких принципов:

  1. Объявить класс как final, чтобы его нельзя было унаследовать.
  2. Сделать все поля private и final, чтобы их нельзя было изменить после инициализации.
  3. Не предоставлять сеттеры (set-методы), чтобы запретить изменение полей после создания объекта.
  4. Инициализировать все поля в конструкторе.
  5. Обеспечить, что mutable объекты внутри класса не изменяются (если есть массивы или списки, возвращать их копии).
public final class Person {

   private final String name;

   private final int age;

   public Person(String name, int age) {

       this.name = name;

       this.age = age;

   }

   public String getName() {

       return name;

   }

   public int getAge() {

       return age;

   }

}

Использование записей (Records) в Java

В Java 14 появился новый тип классов — records, которые автоматически создают неизменяемые объекты. Они упрощают создание классов, которые содержат только данные.

public record Person(String name, int age) {

}

Что изменилось?

Более короткий код — теперь нет необходимости явно писать конструктор, геттеры и final модификаторы. В record все это делается автоматически, так же как генерация toString(), equals(), hashCode() методов.

Пример использования:

public class Main {

   public static void main(String[] args) {

       Person person = new Person("Anastasia", 42);

       System.out.println(person); // -> Person[name=Anastasia, age=42]

       System.out.println(person.name()); // -> Anastasia

       System.out.println(person.age());  // -> 42

   }

 }

Поэтому, если класс используется только для хранения данных, то record — отличная альтернатива.

Подпишитесь на наш Ютуб-канал! Полезные видео для программистов уже ждут вас! YouTube
Выберите свой курс! Путь к карьере программиста начинается здесь! Посмотреть

Итог

Immutable объекты в Java — это объекты, которые нельзя изменить после создания. Они обеспечивают более безопасный, предсказуемый и стабильный код, что особенно важно в многопоточных приложениях.

Основные принципы создания immutable объектов:

  • final класс (чтобы предотвратить наследование)
  • private final поля (во избежание изменений)
  • Инициализация полей через конструктор
  • Отсутствие сеттеров

Благодаря Java Records, создавать immutable объекты стало еще проще. Record автоматически генерирует все необходимые методы, уменьшая код и делая его более читабельным.

Когда стоит использовать immutable объекты?

  • В многопоточных программах — нет риска неконтролируемых изменений.
  • Для объектов, которые служат ключами в HashMap или HashSet — стабильность hashCode() и equals().
  • Как DTO (Data Transfer Object) — когда объекты нужны только для передачи данных.
  • Как значения в кэшах — поскольку неизменяемые объекты не изменяются, они хорошо подходят для кэширования.Как DTO (Data Transfer Object) — когда объекты нужны только для передачи данных.

Если вы хотите детальнее изучить Java, обратите внимание на учебный центр FoxmindEd, где вы найдете структурированные курсы и опытных преподавателей.

FAQ
Immutable объект - это объект, состояние которого нельзя изменить после создания.
Они повышают безопасность в многопоточных программах, обеспечивают стабильность hashCode() и упрощают кэширование.
Объявить класс как final, сделать все поля private final, инициализировать их в конструкторе и не предоставлять сеттеры.
Любые операции изменения строки создают новый объект, что предотвращает нежелательные модификации.
Это специальные классы для сохранения данных, которые автоматически создают конструктор, геттеры и методы equals() и hashCode().
В многопоточных программах, для ключей в HashMap, как DTO и для кэширования данных.

Хотите узнать больше о Immutable объектах в Java? Задайте свой вопрос в комментариях ниже! 🤔👇👇

Добавить комментарий

Ваш имейл не будет опубликован. Обязательные поля отмечены *

Сохранить моё имя, имейл и адрес сайта в этом браузере для будущих комментариев

foxmindED
День рождения FoxmindEd! Скидка 20% на все IT-курсы!
до конца акции
00
дней
00
годин
00
минут
Забронировать