什么是Java中的无状态对象?
目前,我正在阅读“实践中的Java并发”,其中包含以下语句:
由于访问无状态对象的线程的操作不会影响其他线程上操作的正确性,因此无状态对象是线程安全的。
那么,什么是无国籍的对象呢?
无状态对象是没有实例字段的实例(实例variables)。 这个类可能有字段,但它们是编译时常量(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); } }
这个对象有状态,所以它不是无状态的。 但是,它的状态只设置一次,并且以后不会改变,这种types的对象被称为不可变的 :
class Immutable { final String testString; Immutable(String testString) { this.testString = testString; } void test() { System.out.println(testString); } }
一个没有状态的对象,像实例variables一样,可以根据对象已经发生的变化而变化和变化
无状态对象是没有任何内部状态的对象(内部variables)
无国籍客体的概念与副作用的概念高度相关。 不久,这就是没有任何字段的对象可能具有不同的值,这取决于方法调用的不同顺序。
只是一个澄清。 你可以认为你的类是无状态的,即使它有一个实例variables,只要这个variables是最终的和不可变的。
如果实例variables只是最终的,但是可变的,例如,一个string列表,是的,variables的引用不能被改变,但是List的内容以及类的状态是可以改变的。
如果一个对象完全没有状态,那么在这个时候再使用它们就没有问题了,问题是:如果他们完全没有状态,为什么不使所有的方法都是静态的,而不是创build一个呢?
如果你不能改变对象的任何参数或值等,那么在它创build之后,那个对象是线程安全的。