Что такое объект без состояния в Java?

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

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

Итак, что такое объект без гражданства?

8 ответов

Решение

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

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

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

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

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

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

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

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

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

class Immutable {
    final String testString;

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

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

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

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

Как можно изменить ценности?

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

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

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

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

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

Stateless: it has no fields and references no fields from other classes.

Состояние для конкретного вычисления существует исключительно в локальных переменных, которые хранятся в стеке потока и доступны только для выполняющегося потока.

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

Since the actions of a thread accessing a stateless object cannot
affect the correctness of operations in other threads, Stateless objects are threadsafe.

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

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

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

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

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

Другие вопросы по тегам