我在看单例模式的这两个实现:
Class Customer {
int x;
static int count = 0;
private Customer()
{
x = 1;
}
public static Customer GetCustomer()
{
if(count==0)
{
count++;
return new Customer();
}
else
{
return null;
}
}
}
如果类已经实例化一次,则不调用构造函数的实现 1。或者
Class Customer{
int x;
static int count = 0;
public Customer()
{
if(count == 0)
{
x = 1;
count++;
}
else
{
return;
}
}
实现 2,无论类是否已经实例化一次,都调用构造函数。我在网上看了一个视频讲座,说实现 2 不是首选,因为它为构造函数分配内存,尽管对象没有第二次实例化。我知道 Java 有自动垃圾收集功能,但只是想知道我在视频讲座中观看的内容是否相关。
最佳答案
有些人会说没有单例的实现是正确的,但我不完全属于那个阵营。
人们经常倾向于错误地使用它们(例如,作为上帝的对象),但它们仍然有它们的位置(在我的看来,这与这个答案没什么关系)。
为了这个答案的目的,我假设你已经做出了需要单例的正确决定,但我强烈建议你仔细阅读它的潜在问题 - 很可能有更好的方法来实现你的目的。
话虽如此,我不确定您的代码示例是否正确。单例应该返回一个且仅一个实例,必要时创建一个实例,如果不需要则为您提供之前创建的实例。
我看不出您的第一个代码示例如何遵守该契约(Contract)。它会在第一次调用时给你一个新的,然后它不会给你任何东西。
而您的第二个代码示例似乎根本根本无法阻止多个对象。
所以我会非常仔细考虑您是否想继续观看该视频,如果这是他们提供的教育质量。
无论如何,我更喜欢只构造一次的那个,因为你应该只拥有那个类的一个对象。换句话说,适当同步的静态 getMe()
调用可防止竞争条件允许创建多个 Me
对象,并且第一次创建一个新对象,在后续调用中返回该相同对象。
在伪代码中,这将是这样的:
class Me {
private Me() {};
private static Me *loner = NULL;
public static synchronised Me *getMe() {
if loner == NULL
loner = new Me();
return loner;
}
}
关于java - 哪个是更好的单例实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255810/