java - 哪个是更好的单例实现?

标签 java design-patterns singleton

我在看单例模式的这两个实现:

 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/

相关文章:

java - 算术表达式的正则表达式

wpf - 需要有关在 WPF 中实现 UI 的建议

php - 单例 PDO 模型 - 层次结构

multithreading - 具有多线程的 Scala 单例对象

java - 如何在独立的 Java 应用程序中有效地实现单例监听器?

java - 自定义相机在启动时崩溃应用程序

java - Java中整数乘法的渐近复杂度是多少

java - 如何在java中存储有变音符号的字符串

java - Android中的单例与应用程序上下文?

c# - 避免应用程序中模块的异常