单身有状态吗?

时间:2011-09-29 18:10:30

标签: java spring design-patterns singleton

嗨,我在面试问题文件中提到了这个问题。

  

Singleton和Prototype(非单身)是有状态的,是无国籍的

我不确定原型是否是无状态的?这个问题有问题吗?

7 个答案:

答案 0 :(得分:6)

问题本身措辞不力。您可以在Singletons和Prototypes(实例)中拥有状态,因为它是合法代码,但在任何一种情况下您都不需要具有状态。由于提到了Spring,我将尝试回答有关使用Spring的问题。

就Spring bean范围而言,singleton将导致ApplicationContext创建单个实例,并在要求bean的每个地方使用该实例。每次要求bean时,prototype都会导致ApplicationContext创建一个新实例。

这两种情况都可以是有状态的。

答案 1 :(得分:5)

原型bean和Singleton bean都可以保持状态。但是,根据the Spring documentation,“您应该将原型范围用于所有有状态的bean,而单例范围应该用于无状态bean。”

答案 2 :(得分:4)

如果您将“无国籍”视为“没有会话状态”,即与某个特定客户的对话相关的状态,则此问题看起来非常合法(尽管措辞不佳)。

在这些术语中,singleton - 作用域bean通常是无状态的,因为它们被多个客户端同时使用,并且它们的状态不是特定于客户端的。

相反,prototype - 作用域bean通常是在与特定客户端的对话环境中创建的(尽管requestsession范围有时可能更合适),所以他们的状态与这些对话有关(因为如果你的bean不需要保持任何会话状态,你可以使它成为singleton)。在这个意义上,prototype bean是有状态的。

答案 3 :(得分:0)

一个更好的问题可能是“Singleton线程安全吗?”

如果它包含的状态是只读且不可变的,那么它是完全线程安全的。如果它是可变的,你只需要更加小心。如果是,它可能有成为您的应用程序的瓶颈的危险。必须完成同步该共享的可写状态。

答案 4 :(得分:0)

singleton不是数据对象,请考虑将singleton作为数据包装器, 访问点方法,

单身可能会被破坏,但呈现的状态是独立存储的,并且会在重建单身后呈现 (android发送问候,摧毁单身人士是臭名昭着的陷阱)

答案 5 :(得分:0)

无状态Bean:单例且仅初始化一次的Bean。他们具有的唯一状态是共享状态。这些bean是在ApplicationContext初始化时创建的。在此ApplicationContext的生存期内,将返回/注入SAME bean实例。

有状态的bean:可以携带状态(实例变量)的bean。这些是在每次需要对象时创建的。

答案 6 :(得分:-1)

无状态单例几乎是静态方法的集合;它与静态util类没有什么不同,并且它有多少实例并不重要:0,1,2或无穷大。

因此,单身人士通常是有状态的。

(这就是为什么认为在枚举中实现的单例自动处理序列化问题是荒谬的。单例是无状态的,参数是没有意义的;如果单例是有状态的,则参数被破坏)