为什么我出乎意料地能够创建我的单例类的多个实例?

时间:2013-07-15 18:06:41

标签: java design-patterns

据我所知 Singleton Design Pattern 意味着我们只能创建一个 SINGLE OBJECT 类。

以下代码成功运行,没有任何错误/异常。

我希望代码失败,因为SingletonExample类有一个私有默认构造函数。

public class SingletonExample {
    private static SingletonExample singletonInstance;

    private SingletonExample() {
    }

    public static SingletonExample getSingletonInstance() {
        if (null == singletonInstance) {
            System.out.println("Creating new instance");
            singletonInstance = new SingletonExample();
        }
        return singletonInstance;
    }

    public void printSingleton(){
        System.out.println("Inside print Singleton");
    }

    public static void main(String a[])  {
        SingletonExample singObj1 = new SingletonExample();
        SingletonExample singObj2 = new SingletonExample();
    }
}

我的代码有问题吗?

4 个答案:

答案 0 :(得分:23)

由于您的main方法位于类SingletonExample中,因此main代码可以访问私有构造函数。

尝试将main方法移至另一个班级。

答案 1 :(得分:0)

你在同一个类中调用单例类的私有构造函数,这样你就可以访问构造函数了。设计模式将定义规则以避免正常的人为错误。

答案 2 :(得分:0)

单例模式的目的是控制实例数并且您已正确完成。只有这个类可以创建实例,所以只做一个。

答案 3 :(得分:0)

使用枚举而不是类。并且没有人能够替换您的实例:

public enum SingletonExample {
    singletonInstance;

    private SingletonExample() {
        System.out.println("Creating new instance");          
    }

    public static void main(String a[])  {

    }
}