Java Singleton模式

时间:2010-05-14 06:42:03

标签: java design-patterns singleton initialization

编辑:已回答 - 错误是方法不是静态的

我使用了Singleton Design Pattern

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }

我的问题是如何在另一个类中创建类Singleton的对象?

我试过了:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

什么是正确的代码?

谢谢, 斯潘塞

8 个答案:

答案 0 :(得分:26)

Singleton singleton = Singleton.getInstance();

是正确的方法。确保您的getInstance()方法确实是static

由于您的Singleton实现远非安全 - 您的对象可以通过反射进行实例化,您可能需要根据enum

创建单例

答案 1 :(得分:3)

Singleton singleton = Singleton.getInstance();应该有效 - 鉴于您的代码,该错误没有意义;你确定你报道的正确吗? (如果您忘记将getInstance方法设置为静态,这是有意义的,您已在上面的代码中完成了。)

您为课程提供的代码是正确的。

最后,一个概念性说明:首先,你不是“创建一个类Singleton的对象” - 这就是Singleton的重点。 :)你只是获得对现有对象的引用。

答案 2 :(得分:2)

这一个:

 Singleton singleton = Singleton.getInstance();

应该有效。这就是在Java中调用静态方法的方法。 getInstance()方法声明为static。你确定你使用的是Singleton类吗?或者你可能在其他包中导入了一个名为相同的类。

答案 3 :(得分:2)

  1. 由于构造函数是私有的,因此使用构造函数创建对象没有意义。
  2. 您应该使用public static Singleton getInstance(),但实施不是很正确。

    if (instance == null) {
    instance = new Singleton();
    }
    return instance;

  3. 这就是你应该这样做的方式。这可确保它在不存在时创建实例,或者只返回现有实例。你的代码也会做同样的事情,但这增加了可读性。

答案 4 :(得分:2)

因为我们不想允许访问多个副本。所以我们需要手动实例化一个对象,但是我们需要保持对单例的引用,以便后续对accessor方法的调用可以返回单例(而不是创建一个新单元)。 那就是为什么

Singleton singleton = Singleton.getInstance();

访问任何singletonObject的正确方法。

答案 5 :(得分:1)

使用

没有错
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

这是让单例对象形成类的方法。我必须有别的东西。请发布更多详情

答案 6 :(得分:1)

仍然可以创建该类的多个实例,如下所示:

Singleton.getInstance().clone()

答案 7 :(得分:0)

因为getInstance()方法也是“静态”和实例字段,所以你可以使用Singleton.getInstance();没有创建类的新exeple。 Thihs是单身人士的傻瓜