这是一个更好的单身实现?(Which is a better singleton implement

2019-09-22 02:44发布

我一直在寻找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有自动垃圾回收,但只是想知道如果我在视频讲座看着是相关的。

Answer 1:

有一些会说, 没有一个单独的实施是正确的,但我不是在该营地相当。

人们往往倾向于不好使用它们(作为神的对象,例如),但他们仍然有自己的位置(在我看来,其中有一点这样的回答做)。

对于这个答案的目的,我会假设你已经在做需要一个单身正确的决定,但我劝你在它的潜在问题读了 - 有可能是一个更好的方式来实现自己的目的。


话虽如此,我不知道,如果你的代码示例是正确的反正。 一个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;
    }
}


Answer 2:

写一个正确的单身并不那么容易。 你需要照顾的竞争条件和抵御反射攻击。 例如,一个私有的构造可能是通过反射调用创建对象的另一种实例。 在Java中最简单和最安全的单身实现与枚举完成:

enum Singleton {
    INSTANCE;
}

这是因为枚举常量由JLS spedified是单身(部分JLS 8.9):

一个枚举类型没有比由它的枚举常数定义的其它实例。



文章来源: Which is a better singleton implementation?