有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

设计模式Java Singleton vs static是否有真正的性能优势?

我正在合并一个CVS分支,其中一个更大的变化是,无论在哪里出现单例模式,都将其替换为具有静态初始化块和所有静态方法的抽象类

这是值得保留的东西吗?因为它需要合并很多冲突,我会在什么样的情况下进行重构

我们在Weblogic 8.1(即JDK 1.4.2)下运行这个应用程序


对不起,托马斯,让我澄清一下

HEAD版本有传统的单例模式(私有构造函数、getInstance()等)

分支版本没有构造函数,是一个“公共抽象类”,并将对象上的所有方法修改为“静态”。过去存在于私有构造函数中的代码被移动到静态块中

然后,该类的所有用法都会发生更改,从而导致合并中出现多个冲突

在一些情况下做出了这种改变


共 (6) 个答案

  1. # 1 楼答案

    从严格的运行时性能角度来看,这种差异实际上可以忽略不计。两者之间的主要区别在于,“静态”生命周期与类加载器相关联,而对于单例来说,它是一个常规的实例生命周期。通常最好远离ClassLoader业务,避免一些棘手的问题,尤其是在尝试重新加载web应用程序时

  2. # 2 楼答案

    如果我最初的帖子是正确的理解,而Sun的讨论是准确的(我认为可能是这样),那么我认为你必须在清晰度和性能之间做出权衡

    问自己以下问题:

    1. Singleton对象是否让我做的更清楚
    2. 我需要一个对象来完成这个任务,还是它更适合静态方法
    3. 我是否需要通过不使用单例获得的性能
  3. # 3 楼答案

    根据我的经验,唯一重要的是哪一个更容易在单元测试中模仿。我一直觉得单身更容易被嘲笑,也更自然。如果您的组织允许您使用JMockit,这并不重要,因为您可以克服这些顾虑

  4. # 4 楼答案

    这个讨论有用吗?(我不知道链接到另一个编程论坛是否是禁忌,但我宁愿不只是引用整个讨论=))

    Sun Discussion on this subject

    结论似乎是,在大多数情况下,它并没有产生足够的影响,尽管从技术上讲,静态方法更有效

  5. # 5 楼答案

    如果需要存储任何状态,我将使用单例,否则将使用静态类。实例化某个东西是没有意义的,即使是单个实例,除非它需要存储某些东西

  6. # 6 楼答案

    静态不利于扩展性,因为静态方法和字段不能由子类扩展或重写

    这也不利于单元测试。在单元测试中,由于无法控制类加载器,因此无法防止不同测试的副作用溢出。在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟的是,同时运行测试将产生不可预测的结果

    如果使用较少,单例模式通常是ok模式。我更喜欢使用DI框架,让它为我管理实例(可能在不同的范围内,比如在Guice中)