在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象。
为了提供它的全局句柄,我们使用“公共静态”方法。
我的问题是为什么需要静电?为什么不公开?
答案 0 :(得分:3)
假设你有一个Singleton类:
public class Singleton {
...
}
然后构造函数可能是私有的,这意味着你不能使用另一个类的new Singleton()
。
因此,访问Singleton类内部内容的唯一方法是使用Singleton.methodName()
或Singleton.fieldName
。
但是为了做到这一点,这些方法和字段不能成为对象的一部分,它们必须是 static
。 getSingleton()
或getInstance()
方法也不例外。
假设你有一个Singleton类:
public class Singleton {
}
我们现在可以添加构造函数了。但它不能公开,因为如果它是公开的那么你可以只使用来自其他每个类的new Singleton()
然后它就不再是单身人士了。所以课程现在看起来像这样。
public class Singleton {
private Singleton(){
}
}
现在构造函数是私有的,这意味着你不能从另一个类实例化它,它也可以从Singleton类中实例化。因此,我们应该添加getInstance()
或getSingleton()
方法。
public class Singleton {
private Singleton(){
}
public Singleton getSingleton(){
return null;
}
}
但是现在我们无法访问它,因为getSingleton()
方法只能用在一个对象上,我们无法从类外部实例化一个Singleton对象。因此,getSingleton()
需要使用Singleton.getSingleton()
进行访问,因此必须成为静态方法。
public class Singleton {
private Singleton(){
}
public static Singleton getSingleton(){
return null;
}
}
到目前为止的答案应该回答这个问题,但它不是一个功能性的Singleton类。所以请继续阅读以获得完整的答案。
现在我们还想从getSingleton()
方法返回Singleton的实例。所以我们还想要一个名为singleton实例的字段指向Singleton类的实例。
public class Singleton {
private Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
但是现在get getSingleton()
方法无法访问实例字段,因为现在编写类的方式实例是对象的字段而不是类,因此实例字段必须变为静态的。
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
现在最后一个问题是变量实例没有在任何地方实例化,所以它总是会返回null
。因此,我们必须检查getSingleton()
,如果实例为null
,则创建new Singleton()
并使实例字段指向它。
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
如果你想要一个线程安全的Singleton类,你可以使用类似的东西(由Boris the Spider建议):
public enum Singleton {
INSTANCE;
private Singleton(){
// TODO
}
}
现在单身人士已经完成了。
答案 1 :(得分:1)
如果方法是公共的并且没有静态,则需要该类的实例才能调用该方法..这没有任何意义。
静态方法可以在没有实例的情况下调用,因为它们属于类