Объекты Stateless и Immutable
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
Привет! Это статья о двух типах объектов в Java:
- stateless объекты (с англ. "без состояния")
- immutable объекты (с англ. "неизменяемые")
Данные объекты используются в многопоточной среде для того, чтобы быть уверенными что эти объекты не будут изменены каким-либо другим потоком. То есть зафиксировали состояние один раз и все. Иначе нам бы пришлось думать о том как синхронизировать доступ к этим объектам из разных потоков. А это замедляет работу программы.
Что такое stateless объект?
Stateless объект, или "объект без состояния" - это объект, в котором нет изменяемых полей. Если проще - это объект, в котором "и менять-то нечего" 🙂
Так что такое "состояние"?
Обычно каждый объект имеет какие-то изменяемые переменные внутри. Например, мы создаем объект Car, и задаем ему:
- цвет: красный
- марка: Феррари
- пробег: 100 км:
Все эти параметры вместе - цвет, марка и пробег - и есть состояние объекта. Если мы, например, поменяем пробег - скажем сделаем его 10000 км - тем самым мы изменим состояние Car:
Так, если мы поменяем любой параметр объекта - цвет, марку, или пробег - состояние опять изменится.
Объект без состояния
Обычно мы создаем объекты так, что они хранят много переменных. И эти переменные изменяются, меняя состояние объекта.
Но это обычно.
На самом деле, изменяемые части - а значит и состояние - есть не у всех объектов. На некоторые посмотришь и скажешь:
Например тут:
1 2 3 4 5 6 |
public class MyStateless { public static void HelloWorld() { System.out.println("Hello World!"); } } |
Что менять? Нечего менять. А тут:
1 2 3 4 5 6 7 8 |
public class MyStateless { private final static String line = "Hello World"; public static void HelloWorld() { System.out.println(line); } } |
Тоже нечего! Переменная line имеет модификатор final, поэтому ее мы поменять не сможем.
Объекты таких классов и называются stateless, или "объектами без состояния".
Что такое immutable объект?
Immutable объекты(с англ. "неизменяемый") - это объект, который не позволяет изменять свои параметры. А если Вы все-же пытаетесь что-то изменить, то получаете новый объект. Но старый останется прежним.
Давайте посмотрим на примере.
Представим, что у нас есть класс Cat. У класса Cat, допустим, два параметра - порода и цвет глаз.
А теперь если подумать, у одной и той же кошки не может же измениться цвет глаз? Она не может внезапно стать другой породы? Да, это будет уже другая кошка.
Попробуем сделать наш объект immutable. Напишем такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public final class ImmutableCat { private String breed; private String eyeColor; public ImmutableCat(String breed, String eyeColor) { this.breed = breed; this.eyeColor = eyeColor; System.out.println("New cat created! It is " + this.breed + " and has " + this.eyeColor + " eyes!"); } public ImmutableCat setBreed(String breed) { ImmutableCat c = new ImmutableCat(breed, this.eyeColor); return c; } public ImmutableCat setEyeColor(String eyeColor) { ImmutableCat c = new ImmutableCat(this.breed, eyeColor); return c; } } |
Как видите, тут у нас есть:
- два параметра - порода и цвет глаз;
- конструктор - мы задаем параметры объекта, а еще выводит в консоль сообщение про создание нового объекта;
- два сеттера - они возвращают новый объект с требуемыми параметрами.
Если запустить этот код:
1 2 3 4 5 6 7 8 9 |
public class Test{ public static void main(String [] args) { ImmutableCat first = new ImmutableCat("Bengal", "green"); ImmutableCat second = first.setBreed("Sphynx"); } } |
Мы получим следующее:
Как видите, когда мы "попробовали изменить" параметры объекта, нам вернулся новый объект с требуемыми параметрами.
В чем разница
Вот вроде и stateless объект не меняется, и immutable переводится как "неизменяемый". В чем же тогда отличие?
Дело в том, что:
- Stateless "искусственно" не меняется. Это обычный объект с "предохранителем", который не позволяет нам поменять состояние объекта.
- Immutable объект не меняется "по своей природе". It was born this way! 🙂 Например, если кошка была рождена сиамской, то уже и быть ей всегда сиамской. Она мне может вдруг персидской породы стать.
Надеемся, что наша статья была Вам полезна. Можно записаться к нам на курсы по Java на сайте.