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节):
枚举类型除了由其枚举常量定义的实例外,没有其他实例
您在哪里找到这些“单例模式”的实现?如果你在一本书里找到它们,我希望你能保留你的收据。