Читаю:
Java SE 8 представляет собой единое наибольшее развитие языка Java в его истории
Относительно небольшое количество возможностей — лямбда-выражения, ссылки на метод
и функциональные интерфейсы — объединены для получения модели программирования, котора
сочетает объектно-ориентированный и функциональный стили. Под руководством Брайана Гетца (Brian Goetz) это слияние достигнуто таким образом, что поощряет лучшие практики — неизменность, отсутствие состояния, композиционность — при сохранении “чувства Java” — удобочитаемости, простоты, универсальности.
Что значит "отсутствие состояния"?
Ответы
Ответ 1
В объектно-ориентированном программировании объект — это сущность, обладающая тремя признаками:
Индивидуальность (identity) — один объект можно отличить от другого.
Поведение (behaviour) — у объекта есть методы, которые меняют его состояние, и через которые он общается с внешним миром.
Состояние (state) — у объекта есть внутренние состояние, которое принадлежит объекту на протяжении его жизни, и от которого зависит поведение.
В Функциональном программировании объектов нет, но есть функции. И функции не имеют состояния — они чистое поведение
В Java 8 были добавлены лямбды и другие вещи из функциональной парадигмы. Лямбд
в функциональном программировании — это анонимная функция и у нее нет состояния.
Вот об этом отсутствии состояния (как функциональном программировании) и идет речь.
Ответ 2
Это плохой перевод термина stateless, то есть объекта который не имеет состояния:
Stateless object is an instance of a class without instance fields (instance variables). The class may have fields, but they are compile-time constants (static final).
переводя на общедоступный русский язык, это объект который не имеет полей/переменны
описывающих его внутреннее состояние. Точнее объект может иметь поля, но это переменные типа static final, то есть неизменяемые.
Update
зачем вообще нужны такие объекты и почему это считается хорошей практикой?
Все зависит от контекста. Есть ситуации, когда это хорошая практика. Для понятности приведу пример из обычной жизни:
Каждое утро вы садитесь с свою машину: в машине под себя любимого уже все настроен
- любимая радиостанция, положение руля, кресел, зеркал, бутылочка с водичкой - то есть ваша машина в данном случае объект stateful, объект, который помнит свое состояние.
Противоположное состояние: вы берете машину напрокат - в прокатной компании из машин
удаляется весь state наработанный предыдущим арендатором - машина моется, чистится
положение кресел, зеркал, магнитолы, сбрасываются в состояние default, выкидываютс
из машины лишние вещи то есть машина превращается в stateless и это хорошо. Обратим внимание, что прокатная компания добивается некоего стандартного состояния машины одинакового для всего своего автопарка (то есть state будет static final - одинаковый для всех экземпляров класса). Ты садишься в машину и все настраиваешь под себя, ты не думаешь о предыдущем состоянии машины.
Вот это и есть контекст: если нам по логике, всегда нужен объект в стандартизированно
состоянии - это работает подход stateless, если же логика требует чтобы мы каждый раз использовали предыдущее состояние - это подход stateful
Ответ 3
Чтобы понять разницу между объектами имеющими состояние и нет, приведу пример:
private static class Stateless {
public String addPrefix(String prefix, String str) {
return prefix + str;
}
}
private static class Stateful {
private String prefix = "prefix";
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String addPrefix(String str) {
return prefix + str;
}
}
Класс Stateless не имеет внутреннего состояния, т.к. у него отсутствуют нестатические поля.
А Stateful, напротив, имеет состояние, т.к. у него есть поле prefix, которое к том
же можно изменять. Изменение нестатических полей объекта называется изменением состояния.
Комментариев нет:
Отправить комментарий