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

时间:2014-07-23 15:56:32

标签: java class

我写了一个程序来从类main中调用一个单例类。我还写了另一个类,我试图为Singleton类创建一个对象。我发现当我尝试从另一个类中创建时,我只能创建一个对象,但是当我尝试从同一个类调用该方法时,它创建了多个对象。我无法理解同一类主方法和其他类主方法的不同之处。 以下是课程:

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

5 个答案:

答案 0 :(得分:3)

而不是:

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()方法来检索您的Singleton。

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();

    }

}

运行它将输出:

  

调用私有构造函数

到你的cmd或终端。

作为最后一点,正如@Swapnil所述:private Singleton() { ... }声明用于表示只有Singleton类本身才能创建实例,这有意义而不是private static final Singleton INSTANCE = new Singleton();你可以通过使用枚举常量来存储实例(由@JonK记录)来进一步优化代码。如需进一步阅读,我建议:singleton pattern in java

干杯。

答案 1 :(得分:2)

在实现单例模式中使用私有构造函数的全部意义在于,您不应该从类外部调用它,以避免直接创建对象。你是从课堂内调用的。因此,问题。

Singleton并不神奇,你需要在你的单例中有一个类似getInstance()的方法,这个方法应该确保只有一次实例。

答案 2 :(得分:1)

每次获取singleton类的实例时,不是创建Singleton类的新对象。有多种方法可以定义单例类。 这是一种创建线程安全的Singleton类的方法。有关详情,请查看此链接http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples#bill-pugh-singleton

public class BillPughSingleton {

private BillPughSingleton(){}

private static class SingletonHelper{
    private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}

public static BillPughSingleton getInstance(){
    return SingletonHelper.INSTANCE;
}

}

答案 3 :(得分:0)

Singleton类:我们只能创建此类的一个对象。

让我们举一个例子:因为Java中的每件事都是对象所以我给你一个真实的例子。 你有一所房子,里面有锁。这个锁只有一把钥匙,如果外面的任何一个想要进入或访问你家中的任何东西,那么他应该拥有那个唯一的钥匙。意味着此约束仅适用于局外人。如果有人已经在房子里,那么他可以做任何事情,对他没有任何限制。

同样,私有构造函数不允许任何人创建该类的第二个对象,但是您可以在同一个类中创建多个对象,因为 private 方法只能由同一个类访问。

Singleton是设计模式,在你的代码设计中就是这样,CreateObj()是SingletonClass的静态方法,它检查对象是否为null然后通过调用构造函数创建对象,否则它返回相同的对象。

答案 4 :(得分:-1)

你不能在类之外创建单例类的对象,因为构造函数是私有的。 构造函数实例化对象。如果构造函数本身是私有的,则该对象永远不会在类外部实例化,而是可以使用getInstance方法。那么你可以在课堂外访问它的功能。