编辑:已回答 - 错误是方法不是静态的
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
什么是正确的代码?
谢谢, 斯潘塞
答案 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)
您应该使用public static Singleton getInstance()
,但实施不是很正确。
if (instance == null) {
instance = new Singleton();
}
return instance;
这就是你应该这样做的方式。这可确保它在不存在时创建实例,或者只返回现有实例。你的代码也会做同样的事情,但这增加了可读性。
答案 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是单身人士的傻瓜