java - SingleTon 类从类外部调用时创建多个对象

标签 java class

我编写了一个程序,从主类内部调用单例类。我还编写了另一个类,我试图从中为 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/

相关文章:

java - Android - 找出用户当前处于哪个上下文/Activity 中?

java - 如何在 Java 中的另一个类中使用一个类的变量?

C++ 扑克牌类

java - 如何保存用户选择的 Intent ?

java - IOException,HTTP 响应代码为 : 400 occurs intermittently and works after server restart

java - 如何在 Linux JVM 64bit 上发生 OutOfMemoryError

具有类成员的 C++ 模板类

c++ - 如何跟踪调用析构函数的位置 - C++

Java 排序集合

java - gradle同步时sun.security.validator.ValidatorException