【问题标题】:Why do we need a private constructor at all?为什么我们需要一个私有构造函数?
【发布时间】:2023-04-09 23:30:01
【问题描述】:

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

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

【问题讨论】:

  • 是的,你错过了你的陈述(问题)的部分,专门提到了singleton
  • 答案没有这么说。私有构造函数只是执行单例模式的一种方式。您只能通过将 main 放在该类中来欺骗它。
  • 创建构造函数private 是实现单例模式所需要做的事情之一。但这不是唯一的,仅此本身并不会自动使其成为单例。
  • 这么多反对票,我应该删除问题吗?
  • @piepi,你不应该,你已经得到了 3 个很好的答案

标签: java constructor


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      基本上3个原因:

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

      2. 如果您有一个仅为常量定义的类,那么您需要密封该类,这样 JVM 就不会在运行时为您创建该类的实例。

      3. 单身

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2021-10-15
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 2015-01-27
        相关资源
        最近更新 更多