Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Что значит “отсутствие состояния”?


Читаю:


  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, которое к том же можно изменять. Изменение нестатических полей объекта называется изменением состояния.

Комментариев нет:

Отправить комментарий