Что такое объект без состояния в Java? - PullRequest
53 голосов
/ 16 марта 2012

В настоящее время я читаю "Параллелизм Java на практике", который содержит это предложение:

Поскольку действие потока, обращающегося к объекту без состояния, не может повлиять на правильность операций в других потоках, объекты без состояния являются потокобезопасными.

Итак, что такое объект без состояния?

Ответы [ 9 ]

81 голосов
/ 16 марта 2012

Объект без сохранения состояния является экземпляром класса без полей экземпляра (переменных экземпляра).Класс может иметь поля, но они являются константами времени компиляции (статический финал).

Очень похожий термин - неизменный .Неизменяемые объекты могут иметь состояние, но оно не изменяется при вызове метода (вызовы метода не присваивают новым значениям поля).Эти объекты также потокобезопасны.

55 голосов
/ 16 марта 2012

Если объект не имеет полей экземпляра, он без состояния .Также он может не иметь состояния, если у него есть некоторые поля, но их значения известны и не изменяются.

Это объект без состояния :

class Stateless {
    void test() {
        System.out.println("Test!");
    }
}

Thisтакже объект без состояния объект:

class Stateless {
    //No static modifier because we're talking about the object itself
    final String TEST = "Test!";

    void test() {
        System.out.println(TEST);
    }
}

Этот объект имеет состояние, поэтому он не не имеет состояния.Тем не менее, его состояние устанавливается только один раз, и он не изменяется позже, этот тип объектов называется immutable :

class Immutable {
    final String testString;

    Immutable(String testString) {
        this.testString = testString;
    }

    void test() {
        System.out.println(testString);
    }
}
2 голосов
/ 16 марта 2012

Концепция объекта без состояния тесно связана с концепцией побочных эффектов .Вкратце, это тот объект, у которого нет полей, которые могут иметь разные значения, в зависимости от разного порядка вызовов методов.

2 голосов
/ 16 марта 2012

Объект без состояния, например переменные экземпляра, которые могут изменяться и изменяться в зависимости от того, что уже произошло с объектом

1 голос
/ 04 марта 2013

Просто уточнение. Вы можете считать свой класс не имеющим состояния тем же способом, который указан ранее, даже если у него есть переменная экземпляра, поскольку эта переменная является окончательной И неизменной.

Если переменная экземпляра является только окончательной, но изменяемой, например, список строк, да, ссылка на переменную не может быть изменена, но содержимое списка и, следовательно, состояние класса могут быть изменены.

1 голос
/ 16 марта 2012

Объект без состояния - это объект, который не имеет внутреннего состояния (внутренняя переменная)

0 голосов
/ 02 июня 2019

Проще говоря, состояние объекта означает значение внутренних переменных в этом объекте.

Stateful - состояние объекта может быть изменено, это означает, что внутренние значения для переменных-членов этого объекта могут быть изменены

Как изменить значения?

Установив значение.

Когда вы можете установить это значение? Когда переменная не является окончательной ..

Итак, чтобы сделать класс не имеющим состояния, сделайте переменную финальной, чтобы значение этой переменной не могло быть изменено ни в установщике, ни в другом методе. Может использоваться только для вычислений.

0 голосов
/ 24 июня 2017

Если вы не можете изменить какой-либо параметр или значение и т. Д. Объекта после его создания, то этот объект является поточно-ориентированным.

0 голосов
/ 16 марта 2012

Объекты, которые не имеют абсолютно никакого состояния, тогда нет проблем с их повторным использованием на этом этапе возникает вопрос: если у них нет абсолютно никакого состояния, почему бы не сделать все методы статичными и никогда не создавать их вообще?

...