什么是Java中的无状态对象?

TU_*_*KAI 58 java terminology

目前我正在阅读"实践中的Java并发",其中包含以下句子:

由于访问无状态对象的线程的操作不会影响其他线程上的操作的正确性,因此无状态对象是线程安全的.

那么,什么是无状态对象?

Boz*_*zho 84

无状态对象是没有实例字段(实例变量)的类的实例.该类可能有字段,但它们是编译时常量(静态最终).

一个非常相关的术语是不可改变的.不可变对象可能具有状态,但在调用方法时它不会更改(方法调用不会为字段分配新值).这些对象也是线程安全的.

  • 如果对象具有字段(非静态),则它具有状态.如果它是不可变的,它只有一个状态,但不是无状态的. (18认同)

Mal*_*olm 60

如果对象没有任何实例字段,则它是无状态的.如果它有一些字段,它也可以是无状态的,但它们的值是已知的并且不会改变.

这是一个无状态对象:

class Stateless {
    void test() {
        System.out.println("Test!");
    }
}
Run Code Online (Sandbox Code Playgroud)

这也是一个无状态的对象:

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

    void test() {
        System.out.println(TEST);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个对象有状态,所以它不是无状态的.但是,它的状态只设置一次,并且以后不会改变,这种类型的对象称为不可变:

class Immutable {
    final String testString;

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

    void test() {
        System.out.println(testString);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 无状态对象没有状态。具有字段的不可变对象无法转换到与创建它们时不同的状态,因此它们只有一种状态。 (3认同)

小智 6

简单来说,对象的状态意味着该对象中内部变量的值。

有状态 - 对象的状态可以更改,意味着可以更改该对象的成员变量的内部值

如何改变数值?

通过设定值。

什么时候可以设置这个值?当变量不是最终变量时..

因此,要使类成为无状态,请将变量设置为最终变量,以便该变量的值既不能在 setter 中也不能在其他方法中更改。它只能用于计算。


om-*_*nom 5

无状态对象的概念与副作用的概念高度耦合。简而言之,该对象下面没有字段,这些字段可以具有不同的值,具体取决于方法调用的不同顺序。