每当我想在我的应用程序代码中使用单例模式时,我就会使用类似的代码:
public class Singleton {
private volatile static Singleton INSTANCE;
public static synchronized Singleton singleton() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
我认为这是非常常见的解决方案,但现在我想知道使用该单例实例的最佳方式是什么,无论是将其用作内联函数:
singleton().doSomething();
singleton().doSomethingElse();
或在每个使用它的类中创建单个字段:
private Singleton mSingleton = singleton(); // Or pass it in constructor
mSingleton.doSomething();
mSingleton.doSomethingElse();
问题
在哪种情况下表现更好?
答案 0 :(得分:-1)
Singelton 只是一个全局变量,使您的代码不灵活,难以重用并难以测试。
创建Singeltons普通对象,并确保在构造对象树时只有一个实例,方法是传递逻辑singelton的唯一实例或使用依赖注入框架。 / p>
你走了一条切线而忘了回答这个问题。 - shmosel
没有必要为性能原因选择某种语法,尤其是在像Java这样的托管语言中。
JVM将在执行时修改和优化生成的字节代码,甚至可以将其重新编译为机器代码。这使得无法判断某种语法对性能的影响。
即使选择的语法有任何性能影响,它是否可识别?语法的更改只能在分数中改变性能。但是要认识到差异,它会超过50%(当两个版本并行运行时为20%)。
这两个方面都会使语法的性能影响无用。不要考虑性能,除非你遇到*一个问题通过测量验证,所讨论的代码确实是瓶颈。其他任何内容都被视为过早优化。
选择您的语法,使其表达您的意图,使您的代码具有最佳可读性。
答案 1 :(得分:-3)
如果Singleton性能会更好,因为如果你多次创建相同的对象来执行相同的任务,它将占用堆中的内存。它消耗堆内存。因此,如果您只使用一个对象来执行任务,那么为什么要创建多个对象。