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

453
14 января 2017, 11:50

Читаю:

Java SE 8 представляет собой единое наибольшее развитие языка Java в его истории. Относительно небольшое количество возможностей — лямбда-выражения, ссылки на методы и функциональные интерфейсы — объединены для получения модели программирования, которая сочетает объектно-ориентированный и функциональный стили. Под руководством Брайана Гетца (Brian Goetz) это слияние достигнуто таким образом, что поощряет лучшие практики — неизменность, отсутствие состояния, композиционность — при сохранении “чувства Java” — удобочитаемости, простоты, универсальности.

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

Answer 1

В Объектно-ориентированном программировании объект это сущность обладающая тремя признаками:

  1. Индивидуальность (identity) - один объект можно отличить от другого.
  2. Поведение (behaviour) - у объекта есть методы, которые меняют его состояние и через которые он общается с внешним миром.
  3. Состояние (state) - у объекта есть внутренние состояние, которое принадлежит объекту на протяжении его жизни и от которого зависит поведение.

В Функциональном программировании объектов нет, но есть функции. И функции не имеют состояния - они чистое поведение

В Java 8 были добавлены лямбды и другие вещи из функциональной парадигмы. Лямбда в функциональном программировании - это анонимная функция и у нее нет состояния.

Вот об этом отсутствии состояния (как функциональном программировании) и идет речь.

Answer 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, то есть неизменяемые.

Answer 3

Чтобы понять разницу между объектами имеющими состояние и нет, приведу пример:

private static class Stateless {
    public String addPrefix(String prefix, String str) {
        return prefix + str;
    }
}
private static class Statable {
    private String prefix = "prefix";
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
    public String addPrefix(String str) {
        return prefix + str;
    }
}

Класс Stateless не имеет внутреннего состояния, т.к. у него отсутствуют нестатические поля.
А Stetable, напротив, имеет состояние, т.к. у него есть поле prefix, которое к тому же можно изменять. Изменение нестатических полей объекта называется изменением состояния.

READ ALSO
Как распарсить json в java?

Как распарсить json в java?

Как распарсить такой код?

484
IDEA смена версии maven проектов из IDE

IDEA смена версии maven проектов из IDE

Как средствами IDE сменить версию всех проектов, дочерних от корневого? Есть maven команда, которая это делает из консоли (чуть позже её добавлю,...

341
Как убрать расстояние между картинками?

Как убрать расстояние между картинками?

Как уменьшить расстояние между дивами? чтоб было, как на картинке?

419