为什么我们需要私有构造函数?

时间:2016-10-13 11:18:31

标签: java constructor

This answer表示我们不能通过private构造函数一次实例化多个对象。我修改了恰恰相反的代码:

class RunDatabase{
    public static void main(String[] args){
        Database db = Database.getInstance("hello");//Only one object can be instantiated at a time
        System.out.println(db.getName());
        Database db1 = Database.getInstance("helloDKVBAKHVBIVHAEFIHB");
        System.out.println(db1.getName());
    }
}
class Database {

    //private static Database singleObject;
    private int record;
    private String name;

    private Database(String n) {
        name = n;
        record = 0;
    }

    public static synchronized Database getInstance(String n) {
        /*if (singleObject == null) {
            Database singleObject = new Database(n);
        }

        return singleObject;*/

        return new Database(n);
    }

    public void doSomething() {
        System.out.println("Hello StackOverflow.");
    }

    public String getName() {
        return name;
    }
}

正如预期的那样,两个字符串都被打印出来。我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

  

我们不能通过私有构造函数一次实例化多个对象。

不,我们可以。 private构造函数仅避免在类外部创建实例。因此,您有责任决定应在何种情况下创建新对象。

  

正如预期的那样,两个字符串都被打印出来。我错过了什么吗?

每次调用getInstance方法时,您都在创建一个新实例。但是您的注释代码包含单例模式的标准延迟初始化实现。取消注释这些部分以查看差异。

您可以查看here的其他单例实现。

答案 1 :(得分:1)

私有构造函数用于阻止其他类创建包含私有构造函数的“Class”对象。

这样做是为了提供单例模式,其中只使用了一个类的实例。

您提到的代码应该只创建该类的一个实例,并仅使用该实例来执行该类的所有操作。但是你修改了违反单例设计模式的代码。

答案 2 :(得分:1)

  

为什么我们需要私有构造函数?

基本上有三个原因:

  1. 如果您不希望该类用户直接创建对象,而是使用构建器或类似物,

  2. 如果您只为常量定义了一个类,那么您需要密封该类,以便JVM不会在运行时为您创建该类的实例。

  3. 单身