Идеальный старт для будущих IT-разработчиков 👨‍💻 со скидкой до 65%!
Узнать больше
24.03.2025
5 минут чтения

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
Что такое неизменяемый объект в Java?

Immutable объект - это объект, состояние которого нельзя изменить после создания.

Зачем использовать immutable объекты?

Они повышают безопасность в многопоточных программах, обеспечивают стабильность hashCode() и упрощают кэширование.

Как создать immutable класс в Java?

Объявить класс как final, сделать все поля private final, инициализировать их в конструкторе и не предоставлять сеттеры.

Почему String является неизменяемой?

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

Что такое Java Records?

Это специальные классы для сохранения данных, которые автоматически создают конструктор, геттеры и методы equals() и hashCode().

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

В многопоточных программах, для ключей в HashMap, как DTO и для кэширования данных.

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

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

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

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