2016-10-13 151 views
-7

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

而且正如预期的那样,这两个字符串正在被打印。我错过了什么?

+2

是啊,你错过了您的statment(的问题),exlusivly refered到'singleton'的部分。 – SomeJavaGuy

+0

答案并不是说这样的事情。私有构造函数仅仅是一种强制单例模式的方式。你只能在主课内进行欺骗。 – f1sh

+0

使构造函数'private'成为实现单例模式所需要做的事情之一。但它不是唯一的,只是这本身并不会自动使它成为单身。 – Jesper

回答

2

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

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

而正如预期的那样,这两个字符串正在打印。我错过了什么?

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

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

1

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

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

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

1

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

基本上3个原因:

  1. ,如果你不希望类的用户直接创建一个对象,而是使用制造商或同类者,

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

  3. 单身

相关问题