Java 为什么单例设计模式中对象的访问器方法必须是;静止的

Java 为什么单例设计模式中对象的访问器方法必须是;静止的,java,static,singleton,Java,Static,Singleton,在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象 为了给它提供一个全局句柄,我们使用了“publicstatic”方法 我的问题是为什么这里需要静态?为什么不只是public?如果该方法是public且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义 相反,静态方法可以在没有实例的情况下调用,因为它们属于类,如果该方法是公共的且没有静态的,则需要该类的实例才能调用该方法。。这毫无意义 相反,静态方法可以在没有实例的情况下调用,因为它们属于类简短回答: 假设您有一个Sing

在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象

为了给它提供一个全局句柄,我们使用了“publicstatic”方法


我的问题是为什么这里需要静态?为什么不只是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;
    }

}
但是现在,get
getSingleton()
方法无法访问实例字段,因为现在编写类的方式是实例是对象的字段,而不是类的字段,因此实例字段也必须是静态的

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;
    }

}
但是现在,get
getSingleton()
方法无法访问实例字段,因为现在编写类的方式是实例是对象的字段,而不是类的字段,因此实例字段也必须是静态的

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已完成。

将其作为实例方法;然后尝试使用