Java 为什么单例设计模式中对象的访问器方法必须是;静止的
在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象 为了给它提供一个全局句柄,我们使用了“publicstatic”方法Java 为什么单例设计模式中对象的访问器方法必须是;静止的,java,static,singleton,Java,Static,Singleton,在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象 为了给它提供一个全局句柄,我们使用了“publicstatic”方法 我的问题是为什么这里需要静态?为什么不只是public?如果该方法是public且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义 相反,静态方法可以在没有实例的情况下调用,因为它们属于类,如果该方法是公共的且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义 相反,静态方法可以在没有实例的情况下调用,因为它们属于类简短回答: 假设您有一个Sing
我的问题是为什么这里需要静态?为什么不只是public?如果该方法是public且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义
相反,静态方法可以在没有实例的情况下调用,因为它们属于类,如果该方法是公共的且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义 相反,静态方法可以在没有实例的情况下调用,因为它们属于类简短回答: 假设您有一个Singleton类:
public class Singleton {
...
}
public class Singleton {
}
然后构造函数可能是私有的,这意味着您不能从另一个类中使用new Singleton()
因此,访问Singleton类内部内容的唯一方法是使用Singleton.methodName()
或Singleton.fieldName
但是为了做到这一点,这些方法和字段不能是对象的一部分,它们必须是静态的。而getSingleton()
或getInstance()
方法也不例外
举例回答:
假设您有一个Singleton类:
public class 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对象。因此需要使用Singleton.getSingleton()
访问getSingleton()
,因此它必须成为一个静态方法
public class Singleton {
private Singleton(){
}
public static Singleton getSingleton(){
return null;
}
}
到目前为止的答案应该能回答这个问题,但它不是一个功能性的单例类。因此,请继续阅读完整答案。
现在我们还想从getSingleton()
方法返回Singleton的实例。所以我们还需要一个名为instanceofsingleton的字段来指向singleton类的实例
public class Singleton {
private Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
但是现在,getgetSingleton()
方法无法访问实例字段,因为现在编写类的方式是实例是对象的字段,而不是类的字段,因此实例字段也必须是静态的
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
最后一个问题是变量实例没有在任何地方实例化,因此它总是返回null
。因此,我们必须在getSingleton()
中检查,如果实例为null
,则创建一个newsingleton()
,并使实例字段指向它
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
如果您想要一个线程安全的单例类,您可以改为使用类似的类(建议使用):
现在单件完成。简短回答:
假设您有一个Singleton类:
public class Singleton {
...
}
public class Singleton {
}
然后构造函数可能是私有的,这意味着您不能从另一个类中使用new Singleton()
因此,访问Singleton类内部内容的唯一方法是使用Singleton.methodName()
或Singleton.fieldName
但是为了做到这一点,这些方法和字段不能是对象的一部分,它们必须是静态的。而getSingleton()
或getInstance()
方法也不例外
举例回答:
假设您有一个Singleton类:
public class 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对象。因此需要使用Singleton.getSingleton()
访问getSingleton()
,因此它必须成为一个静态方法
public class Singleton {
private Singleton(){
}
public static Singleton getSingleton(){
return null;
}
}
到目前为止的答案应该能回答这个问题,但它不是一个功能性的单例类。因此,请继续阅读完整答案。
现在我们还想从getSingleton()
方法返回Singleton的实例。所以我们还需要一个名为instanceofsingleton的字段来指向singleton类的实例
public class Singleton {
private Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
但是现在,getgetSingleton()
方法无法访问实例字段,因为现在编写类的方式是实例是对象的字段,而不是类的字段,因此实例字段也必须是静态的
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
return instance;
}
}
最后一个问题是变量实例没有在任何地方实例化,因此它总是返回null
。因此,我们必须在getSingleton()
中检查,如果实例为null
,则创建一个newsingleton()
,并使实例字段指向它
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getSingleton(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
如果您想要一个线程安全的单例类,您可以改为使用类似的类(建议使用):
现在,Singleton已完成。将其作为实例方法;然后尝试使用