【问题标题】:What is Stateless Object in Java?Java中的无状态对象是什么?
【发布时间】:2012-04-01 21:32:53
【问题描述】:

目前在看《Java concurrency in practice》,里面有这么一句话:

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

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

【问题讨论】:

    标签: java terminology


    【解决方案1】:
    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.
    

    【讨论】:

      【解决方案2】:

      简单来说,对象的状态是指该对象内部变量的值。

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

      如何更改值?

      通过设置值。

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

      因此,要使类无状态,请将变量设为 final,这样该变量的值就不能在 setter 和其他方法中更改。只能用于计算。

      【讨论】:

        【解决方案3】:

        如果您不能更改对象的任何参数或值等,则在创建后,该对象是线程安全的。

        【讨论】:

          【解决方案4】:

          只是一个澄清。 您可以按照前面所述的方式将您的类视为无状态的,即使它有一个实例变量,只要该变量是最终的且不可变的。

          如果实例变量只是最终的但可变的,例如一个字符串列表,是的,变量的引用不能改变,但列表的内容和类的状态可以改变。

          【讨论】:

            【解决方案5】:

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

            这是一个无状态对象:

            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);
                }
            }
            

            【讨论】:

            • "它有一些字段,但众所周知,它们永远不会改变。"那将是不可变的,而不是无状态的
            • @assylias 不一定。如果这些字段是常量,并且它们是在编译时设置的,那么我们总是知道它们的值。这实际上意味着该对象不携带任何状态信息。
            • 无状态对象没有状态。具有字段的不可变对象无法转换到与其创建时不同的状态,因此它们只有一种状态。
            • @assylias 是的,但我说的是那些在创建之前 状态已知的对象。不是那些只设置了一次状态的那些。
            • 当你在做的时候,你也可以提供一个有状态对象的例子,但是一个很好的解释。
            【解决方案6】:

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

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

            【讨论】:

            • 如果一个对象有一个字段(非静态),它就有一个状态。如果它是不可变的,它只有一个状态,但不是无状态的。
            • @om-nom-nom 的回答非常深入。
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              一个完全没有状态的对象,那么重用它们就没有问题 此时的问题是:如果它们完全没有状态,为什么不将所有方法都设为静态并且根本不创建呢?

              【讨论】:

              • “如果它们完全没有状态,为什么不把所有的方法都变成静态的,根本不创建呢?”----我们应该考虑到多态性。或者只是考虑 OO 的规则——“将实现与抽象分离”。在 OO 设计中,我们有一个表示抽象的接口是很常见的,而我们可以有多个实现——实现我们的接口的类。在这种情况下,即使实现类是无状态的,只有静态方法的类也不起作用,因为它无法实现我们的接口。
              【解决方案9】:

              无状态对象是没有任何内部状态(内部变量)的对象

              【讨论】:

                【解决方案10】:

                没有状态的对象,例如可以根据对象已经发生的事情而改变和变化的实例变量

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-08-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-06-13
                  • 2010-09-12
                  • 2011-07-12
                  • 2018-07-29
                  相关资源
                  最近更新 更多