代码之家  ›  专栏  ›  技术社区  ›  rouble

JavaSuntLon模式,所有变量都应该是类变量吗?

  •  2
  • rouble  · 技术社区  · 15 年前

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

    有什么理由不应该声明它们是静态的吗?有什么区别吗?

    5 回复  |  直到 15 年前
        1
  •  12
  •   Nader Shirazie    15 年前

    不。单例模式只意味着一个实例是唯一的实例——它并不意味着“使所有东西都静态地可访问”。

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

    编辑:

    我想说的是,功能的使用方式(取决于上下文)和功能的初始化方式之间存在差异。

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

    此外,使某个静态的东西具有比“我的类只有一个实例应该可以访问”更重要的含义,这通常是意图。

    此外,在我研究过的软件中,对象的初始化和生命周期常常由其他人控制(我在这里讨论的是DI),而使某个东西成为静态的对这里没有帮助。

        2
  •  4
  •   bmargulies    15 年前

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

        3
  •  3
  •   Thilo    15 年前

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

    不将字段声明为静态的原因(即使在单例模式中,您只需要它们的一个实例)是,这使您能够灵活地创建另一个与通常的单例类稍有不同的实例。您可能希望在特殊情况下这样做,例如用于测试。

    即使你不需要这种灵活性,也没有理由放弃。将字段声明为静态字段没有您会失去的好处。

        4
  •  1
  •   paxdiablo    15 年前

    可以 这样做(不一定 应该 )但是,即使对于单例,我也倾向于将所有变量设置为对象级,而不是类级,因为:

    • 我可能在某个时候认为,对于该类来说,单例是一个坏主意,并且拥有类级变量将使重构更加困难。
    • 对于对象级变量,它们只在实例化单例时才存在。在课堂上,他们总是在那里。

    底线:我从来没有想到过将它们作为对象级别有什么缺点,所以我就是这样做的。以上两个阶级层面的缺点可能是微不足道的,但它们确实存在。归根结底,这可能取决于个人喜好。

        5
  •  0
  •   jitter    15 年前

    你可以在这里学习如何在Java中创建一个单独的单子(一种可能的方法):

    Wikibooks Design Patterns: Java Singleton

    基本上,您不需要(也不应该)使类中的所有内容都是静态的,因为您打算将某些内容用作单例。有几个原因

    • 检查Paxdiablo和Thilo的答案
    • 另外,别忘了让它全部是静态的,而不是使它成为单例的,您还需要删除每个构造函数(并使默认的构造函数成为私有的)。