Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java单例vs静态-是否有真正的性能优势?_Java_Design Patterns_Singleton - Fatal编程技术网

Java单例vs静态-是否有真正的性能优势?

Java单例vs静态-是否有真正的性能优势?,java,design-patterns,singleton,Java,Design Patterns,Singleton,我正在合并一个CVS分支,其中一个更大的变化是,无论在哪里出现单例模式,都将其替换为具有静态初始化块和所有静态方法的抽象类 这是值得保留的东西吗?因为它需要合并很多冲突,我会在什么样的情况下进行重构 我们在Weblogic 8.1(即JDK 1.4.2)下运行此应用程序 对不起,托马斯,让我澄清一下 HEAD版本具有传统的单例模式(私有构造函数、getInstance()等) 分支版本没有构造函数,是“公共抽象类”,并将对象上的所有方法修改为“静态”。过去存在于私有构造函数中的代码被移动到静态

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

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

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


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

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

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

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


在一些情况下进行了此更改。

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


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

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

如果我的原始帖子理解正确,并且Sun的讨论是准确的(我认为可能是这样的),然后我认为你必须在清晰度和性能之间进行权衡

问自己以下问题:

  • Singleton对象是否使我正在做的事情更清楚
  • 我需要一个对象来完成这个任务,还是它更适合静态方法
  • 我是否需要通过不使用单例获得的性能

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

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

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

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


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

    编写一些代码来衡量性能。答案将取决于JVM(Sun的JDK的性能可能与JRockit不同)和应用程序使用的VM标志。

    单例与加载它的类加载器的类加载器生存期相关联,就像静态一样。以及?所有的东西都与类加载器的生命周期联系在一起,但是通过放置一个单体,你就可以获得额外的生命周期层,有更多的机会(完成)来正确处理事情。问题实际上是关于性能增益:-考虑你有一个控制器,每秒处理100个请求。这与选择作为无状态服务的单例或类有关吗?