2016-10-13 7 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

да, вы пропустили ту часть, где ваши Постулаты (вопрос), exlusivly refered к 'singleton'. – SomeJavaGuy

+0

Ответ не говорит об этом. Частные конструкторы - всего лишь способ обеспечения синглтонного шаблона. Вы только обманываете его, имея свой основной внутри этого класса. – f1sh

+0

Создание конструктора 'private' является одной из вещей, которые вам нужно сделать для реализации шаблона singleton. Но это не единственное, и только это само по себе не делает его одиночным. – Jesper

ответ

2

Мы не можем создать экземпляр нескольких объектов за один раз через частные конструкторы.

Нет, мы можем. Конструктор private избегает создания экземпляра вне класса. Поэтому вы несете ответственность за принятие решения о том, в каких случаях должен быть создан новый объект.

И, как и ожидалось, печатаются строки. Я что-то пропустил?

Вы создаете новый экземпляр каждый раз, когда вызывается метод getInstance. Но ваш прокомментированный код содержит стандартную ленивую реализацию инициализации одноэлементного шаблона. Раскомментируйте эти части, чтобы увидеть разницу.

Другие варианты однократного использования вы можете посмотреть here.

1

Частные конструкторы используются, чтобы остановить другие классы от создания объекта класса, содержащего частный конструктор.

Это делается для обеспечения шаблона singleton, в котором используется только один экземпляр класса.

Код, который вы упомянули, должен создать только один экземпляр класса и использовать этот экземпляр только для выполнения всех операций этого класса. Но вы изменили код, который нарушает шаблон дизайна singleton.

1

Зачем нам нужен частный конструктор?

В основном 3 причины:

  1. , если вы не хотите, чтобы пользователь класса создает объект непосредственно, а вместо этого использует строитель или похожесть,

  2. , если у вас есть класс, определенный только для констант, тогда вам нужно запечатать класс, чтобы JVM не создавала экземпляры класса для вас во время выполнения.

  3. одиночки

Смежные вопросы