Как написать иммутабельный класс?
Immutable (неизменяемый) класс – это класс, состояние экземпляров которого невозможно изменить после создания.
С иммутабельным классом всегда легче работать. Его состояние не поменяется, значит обращаться к нему в многопоточной среде можно без дополнительной синхронизации. Функции, зависящие только от состояния экземпляра будут возвращать один и тот же результат от вызова к вызову – это облегчает например реализацию hashCode(). Также вместо нескольких одинаковых экземпляров можно использовать один закэшированный объект, экономя память (паттерн Приспособленец).
Шаги, которые необходимо предпринять, чтобы класс стал immutable:
1. Запретите расширение класса – либо объявите его final , либо закройте доступ наследникам ко всем способам мутации, перечисленным в следующих пунктах;
2. Сделайте все поля финальными;
3. Не выставляйте наружу методов-мутаторов, которые меняют состояние;
4. Не отдавайте наружу поля ссылочного изменяемого типа (объекты классов, массивы) – если объект под ссылкой не иммутабельный, должна возвращаться его глубокая копия (defensive copy);
5. Создавайте объект правильно (подробнее в следующем посте).
Если вам нужны преимущества иммутабельного объекта, но также нужно иногда изменять его, подойдет подход copy on write: каждый метод-мутатор должен мутировать и возвращать не сам объект, а только что созданную его копию. Оригинал всё так же остается неизменным.
Создание неизменяемого класса в Java
Класс называется неизменяемым в Java, когда вы не можете изменить его после того, как создали.
В общем случае мы изменяем значения полей класса, используя методы установки, переназначая значения. Мы можем изменить методы, наследуя их.
Как создать неизменяемый класс в Java:
- Класс должен быть окончательным, чтобы вы не могли его наследовать.
- Все свойства должны быть окончательными, чтобы они оставались постоянными.
- Методы установки не должны быть созданы.
Пример
public final class Sample < private final String name; private final int age; public Sample(final String name, final int age) < this.name = name; this.age = age; >public int getAge() < return age; >public String getName() < return name; >>
Средняя оценка 0 / 5. Количество голосов: 0
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Как сделать иммутабельный класс java
«Иммутабельный класс» означает неизменяемый. Например, String является иммутабельным классом.
Для того чтобы класс считался иммутабельным — все его поля должны быть final . То есть любое изменение внутреннего состояния объекта, на основании иммутабельного класса, влечет за собой всегда создание нового объекта этого же класса.
Начиная с java 14 появился дополнительный синтаксис для создания неизменяемых объектов: java records .
Объекты Stateless и Immutable
Данные объекты используются в многопоточной среде для того, чтобы быть уверенными что эти объекты не будут изменены каким-либо другим потоком. То есть зафиксировали состояние один раз и все. Иначе нам бы пришлось думать о том как синхронизировать доступ к этим объектам из разных потоков. А это замедляет работу программы.
Что такое stateless объект?
Stateless объект, или «объект без состояния» — это объект, в котором нет изменяемых полей. Если проще — это объект, в котором «и менять-то нечего»
Так что такое «состояние»?
Обычно каждый объект имеет какие-то изменяемые переменные внутри. Например, мы создаем объект Car, и задаем ему:
Все эти параметры вместе — цвет, марка и пробег — и есть состояние объекта. Если мы, например, поменяем пробег — скажем сделаем его 10000 км — тем самым мы изменим состояние Car:

Так, если мы поменяем любой параметр объекта — цвет, марку, или пробег — состояние опять изменится.

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