Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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

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 哪个是更好的单例实现?_Java_Design Patterns_Singleton - Fatal编程技术网

Java 哪个是更好的单例实现?

Java 哪个是更好的单例实现?,java,design-patterns,singleton,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 nul

我正在研究单例模式的这两种实现:

 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有自动垃圾收集功能,但我只是想知道我在视频讲座中看到的内容是否相关。

有些人会说,没有一个实现是正确的,但我并不完全属于这个阵营

人们通常倾向于不恰当地使用它们(例如,作为神的对象),但它们仍然有自己的位置(在我看来,这与这个答案没有什么关系)

为了回答这个问题,我假设你已经做出了正确的决定,需要一个单身汉,但我强烈建议你仔细阅读它的潜在问题——很可能有更好的方法来达到你的目的


话虽如此,我不确定您的代码示例是否正确。singleton应该只返回一个实例,必要时创建一个实例,如果没有,则提供先前创建的实例

我看不出你的第一个代码样本是如何履行合同的。它会给你一个新的第一次调用,然后它会给你什么都没有

您的第二个代码示例似乎根本无法阻止多个对象

所以我会非常仔细地考虑,如果这是他们提供的教育质量的话,你是否想继续观看这段视频


在任何情况下,我更喜欢只构造一次的类,因为您应该只拥有该类的一个对象。换句话说,一个静态的
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中最简单、最安全的单例实现是使用枚举完成的:

enum Singleton {
    INSTANCE;
}
这是因为JLS将枚举常量指定为单例(JLS第8.9节):

枚举类型除了由其枚举常量定义的实例外,没有其他实例


您在哪里找到这些“单例模式”的实现?如果你在一本书里找到它们,我希望你能保留你的收据。