Объекты Stateless и Immutable

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Данная статья:

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java"

Привет! Это статья о двух типах объектов в Java:

  • stateless объекты (с англ. "без состояния")
  • immutable объекты (с англ. "неизменяемые")

Данные объекты используются в многопоточной среде для того, чтобы быть уверенными что эти объекты не будут изменены каким-либо другим потоком. То есть зафиксировали состояние один раз и все. Иначе нам бы пришлось думать о том как синхронизировать доступ к этим объектам из разных потоков. А это замедляет работу программы.

Что такое stateless объект?

Stateless объект, или "объект без состояния" - это объект, в котором нет изменяемых полей. Если проще - это объект, в котором "и менять-то нечего" 🙂

Так что такое "состояние"?

Обычно каждый объект имеет какие-то изменяемые переменные внутри. Например, мы создаем объект Car, и задаем ему:

  • цвет: красный
  • марка: Феррари
  • пробег: 100 км:

Все эти параметры вместе - цвет, марка и пробег - и есть состояние объекта. Если мы, например, поменяем пробег - скажем сделаем его 10000 км - тем самым мы изменим состояние Car:

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

Объект без состояния

Обычно мы создаем объекты так, что они хранят много переменных. И эти переменные изменяются, меняя состояние объекта.

Но это обычно.

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

Например тут:

Что менять? Нечего менять. А тут:

Тоже нечего! Переменная line имеет модификатор final, поэтому ее мы поменять не сможем.

Объекты таких классов и называются stateless, или "объектами без состояния".

Что такое immutable объект?

Immutable объекты(с англ. "неизменяемый") - это объект, который не позволяет изменять свои параметры. А если Вы все-же пытаетесь что-то изменить, то получаете новый объект. Но старый останется прежним.

Давайте посмотрим на примере.

Представим, что у нас есть класс Cat. У класса Cat, допустим, два параметра - порода и цвет глаз.

А теперь если подумать, у одной и той же кошки не может же измениться цвет глаз? Она не может внезапно стать другой породы? Да, это будет уже другая кошка.

Попробуем сделать наш объект immutable. Напишем такой код:

Как видите, тут у нас есть:

  • два параметра - порода и цвет глаз;
  • конструктор - мы задаем параметры объекта, а еще выводит в консоль сообщение про создание нового объекта;
  • два сеттера - они возвращают новый объект с требуемыми параметрами.

Если запустить этот код:

Мы получим следующее:

Как видите, когда мы "попробовали изменить" параметры объекта, нам вернулся новый объект с требуемыми параметрами.

В чем разница

Вот вроде и stateless объект не меняется, и immutable переводится как "неизменяемый". В чем же тогда отличие?

Дело в том, что:

  • Stateless "искусственно" не меняется. Это обычный объект с "предохранителем", который не позволяет нам поменять состояние объекта.
  • Immutable объект не меняется "по своей природе". It was born this way! 🙂 Например, если кошка была рождена сиамской, то уже и быть ей всегда сиамской. Она мне может вдруг персидской породы стать.

Надеемся, что наша статья была Вам полезна.  Можно записаться к нам на курсы по Java на сайте.

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr
Самоучители--узнать детальнее--