java单例模式,应该所有变量都是类变量吗?

时间:2009-11-20 00:31:40

标签: java design-patterns static singleton class-variables

如果一个类实现了单例模式,那么是否应该将所有变量声明为静态?

有什么理由不应该宣布它们是静态的吗?它有所作为吗?

5 个答案:

答案 0 :(得分:12)

没有。单例模式只意味着单个实例是唯一的实例 - 它并不意味着“使所有内容都可以静态访问”。

单例模式为您提供了“单个实例”的所有好处,同时又不会牺牲测试和重构代码的能力。

编辑:

我要说的是,应该如何使用功能(取决于上下文)和如何初始化功能之间存在差异。

在大多数情况下,您的对象只有一个实例(例如,在您的最终生产系统中),这可能是合适的。但是如果你强迫它成为唯一的选择,还有其他的情境(比如测试)会变得更加困难。

另外,制作一些静态的东西比“只有我班级的一个实例应该是可访问的”更重要 - 这通常是意图。

此外,在我所使用的软件中,对象的初始化和生命周期通常由其他人控制(我在这里谈论DI) - 并且制作静态的东西在这里没有用。

答案 1 :(得分:4)

在一个常见的单例模式中,您可以使用静态。您将类编码为使用普通字段,在构造函数中初始化,然后安排执行一次新的MyClass(),将结果存储在某个静态位置。

答案 2 :(得分:3)

不,唯一通常是静态的是对单例本身的引用(还有其他方法来存储该引用,例如JNDI或依赖注入容器)。

不将字段声明为静态的原因(即使在单例模式中,您只需要它们的一个实例),这使您可以灵活地创建另一个稍微不同的常规单例类实例。您可能希望在特殊情况下执行此操作,例如进行测试。

即使你(不认为你)需要这种灵活性,也没有理由放弃它。将一个字段声明为静态没有任何好处,你会丢失。

答案 3 :(得分:1)

可以执行此操作(不一定 )。但是,即使对于单身人士,我倾向于将所有变量都设置为对象级别而不是类级别,因为:

  • 我可能在某个时候决定单例对于那个类来说是一个坏主意,并且使用类级变量会使重构变得更难。
  • 对于对象级变量,它们仅在您实例化单例时才存在。在班级,他们总是在那里。

结论:我从来没有想到将它们作为对象级别的缺点,所以我就是这样做的。类级别的上述两个缺点可能是微不足道的,但它们就在那里。最终可能归结为个人偏好。

答案 4 :(得分:0)

您可以在这里阅读如何(一种可能的方式)在Java中创建单例:

Wikibooks Design Patterns: Java Singleton

基本上你不需要(也不应该)将类中的所有东西都设置为静态,因为你打算将某些东西用作单例。有几个原因

  • 查看paxdiablo和Thilo的答案
  • 另外请不要忘记将它全部设为静态不会使它成为单例,您还需要删除每个构造函数(并使默认构造函数为私有)