gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:51:55 25 4
gpt4 key购买 nike

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

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com