我编写了一个程序,从主类内部调用单例类。我还编写了另一个类,我试图从中为 Singleton 类创建一个对象。我发现当我尝试从另一个类调用该方法时,我只能创建一个对象,但是当我尝试从同一个类调用该方法时,它会创建多个对象。我无法理解同一个类的主方法和其他类的主方法有什么不同。 以下是类(class):
SingleTonClass.java
public class SingleTonClass {
private static SingleTonClass obj = null;
private SingleTonClass() {
System.out.println("Private Constructor is called");
}
public static SingleTonClass CreateObj() {
if (obj == null) {
obj = new SingleTonClass();
}
return obj;
}
public void display() {
System.out.println("The Ojecte creation complete");
}
public void display1() {
System.out.println("The second obj creation is comeplete");
}
public static void main(String[] args) {
SingleTonClass stc = new SingleTonClass();
SingleTonClass stc1 = new SingleTonClass();
SingleTonClass stc2 = new SingleTonClass();
// stc.display();
// stc1.display1();
}
}
SingleTonClassTest.java
public class SingleTonClassTest {
public static void main(String[] args) {
SingleTonClass stc=SingleTonClass.CreateObj();
SingleTonClass stc1=SingleTonClass.CreateObj();
SingleTonClass stc2=SingleTonClass.CreateObj();
}
}
最佳答案
而不是这样做:
private static SingleTonClass obj=null;
你应该使用:(很抱歉同时更改了你奇怪的类名)。
private static final Singleton INSTANCE = new Singleton();
实例化 Singleton 的唯一实例。
之后,您将不会进行一些神秘的检索,例如:
public static SingleTonClass CreateObj()
{
if (obj==null)
{
obj= new SingleTonClass();
}
return obj;
}
相反,您应该定义 getInstance()
方法来检索您的单例。
public static Singleton getInstance() {
return INSTANCE;
}
完成这些修改后,您的 Singleton 类应如下所示:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
// This is called only once
System.out.println("Private Constructor is called");
}
public static Singleton getInstance() {
return INSTANCE;
}
public static void main(String[] args) {
// Even if you ask 100 times, this will only return the same INSTANCE
Singleton stc = Singleton.getInstance();
Singleton stc1 = Singleton.getInstance();
Singleton stc2 = Singleton.getInstance();
}
}
运行它会输出:
Private Constructor is called
到您的cmd或终端。
最后一点,正如 @Swapnil 所说:private Singleton() { ... }
声明用于指示只有 Singleton 类本身才能创建实例,这使得感觉而不是做 private static Final Singleton INSTANCE = new Singleton();
您可以通过使用枚举常量来存储实例(由 @JonK 指出)来进一步优化代码。如需进一步阅读,我建议:singleton pattern in java
干杯。
关于java - SingleTon 类从类外部调用时创建多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915336/