Может ли конструктор в Java быть приватным?

Может ли конструктор быть закрытым? Как полезен частный конструктор?

Ответ 1

Да, конструктор может быть закрытым. Это разные способы использования. Одно из таких применений для singleton design anti-pattern, которое я бы посоветовал вам использовать. Другое, более законное использование - это делегирование конструкторов; у вас может быть один конструктор, который принимает множество различных опций, которые действительно являются деталями реализации, поэтому вы делаете их закрытыми, но затем ваши остальные конструкторы делегируют ему.

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

public class MyClass {
     private final String value;
     private final String type;

     public MyClass(int x){
         this(Integer.toString(x), "int");
     }

     public MyClass(boolean x){
         this(Boolean.toString(x), "boolean");
     }

     public String toString(){
         return value;
     }

     public String getType(){
         return type;
     }

     private MyClass(String value, String type){
         this.value = value;
         this.type = type;
     }
}

Изменить
Глядя на этот ответ несколько лет спустя, я хотел бы отметить, что этот ответ является неполным, а также немного экстремальным. Синглтоны действительно являются анти-образными и, как правило, следует избегать, когда это возможно; однако есть много применений частных конструкторов, кроме синглтонов, и мой ответ называет только один.

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

  • Чтобы создать неинтуитивный класс, который представляет собой просто набор связанных статических функций (это в основном одноэлементный, но если он не имеет состояния и статические функции работают строго по параметрам, а не по состоянию класса, это не как необоснованный подход, как представляется, как мой предыдущий "я", хотя использование интерфейса, который вводится зависимостями, часто упрощает поддержку API, когда для реализации требуется большее количество зависимостей или других форм контекста).

  • Когда существует несколько разных способов создания объекта, частный конструктор может упростить понимание различных способов его создания (например, более читаемый для вас new ArrayList(5) или ArrayList.createWithCapacity(5), ArrayList.createWithContents(5), ArrayList.createWithInitialSize(5)). Другими словами, частный конструктор позволяет вам предоставить функцию factory, чьи имена более понятны, а затем создание закрытого конструктора гарантирует, что люди используют только более самоочевидные имена. Это также обычно используется с шаблоном построителя. Например:

    MyClass myVar = MyClass
        .newBuilder()
        .setOption1(option1)
        .setOption2(option2)
        .build();
    

Ответ 2

Я ожидал, что кто-то упомянул об этом (2-й пункт), но... есть три использования частных конструкторов:

  • чтобы предотвратить создание экземпляра вне объекта, в следующих случаях:

    • одноточечно
    • factory метод
    • класс static-methods-only (utility)
    • класс констант
      .
  • чтобы предотвратить подсечение (расширение). Если вы создаете только частный конструктор, ни один класс не может расширить ваш класс, потому что он не может вызвать конструктор super(). Это своего рода синоним для final

  • перегруженные конструкторы - в результате методов перегрузки и конструкторов некоторые могут быть частными и некоторыми публичными. Особенно, если в ваших конструкторах есть непубличный класс, вы можете создать публичный конструктор, который создает экземпляр этого класса, а затем передает его частному конструктору.

Ответ 3

Да, может. Частный конструктор будет существовать, чтобы предотвратить создание экземпляра класса, или потому, что построение происходит только внутренне, например. a Factory. См. здесь для получения дополнительной информации.

Ответ 4

Да.

Это значит, что вы можете управлять тем, как создается экземпляр класса. Если вы сделаете конструктор закрытым, а затем создайте видимый метод конструктора, который возвращает экземпляры класса, вы можете делать такие вещи, как ограничение количества созданий (как правило, гарантируется только один экземпляр) или экземпляры рециркуляции или другие связанные с строительством задачи.

Выполнение new x() никогда не возвращает null, но с использованием шаблона factory вы можете вернуть null или даже вернуть разные подтипы.

Вы можете использовать его также для класса, у которого нет экземпляров или свойств экземпляра, только статические - как в классе служебных функций.

Ответ 5

Хорошо, если все ваши методы в классе статичны, то частный конструктор - хорошая идея.

Ответ 6

Частные конструкторы могут быть определены в Java по следующим причинам.

  • Чтобы иметь контроль над созданием объектов Java, он не позволит вам создать экземпляр объекта.

  • Это не разрешает подкласс класса

  • Это имеет особое преимущество при реализации singleton Pattern, для него используются частные конструкторы и имеют элемент управления созданием экземпляра для всего приложения.

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

Ответ 7

Некоторые причины, по которым вам может понадобиться частный конструктор:   Доступ к конструктору возможен только из статического factory метода внутри самого класса. Singleton также может принадлежать этой категории.    Класс > , который содержит только статические методы.

Ответ 8

Да.

Частный конструктор используется для предотвращения инициализации экземпляра, такого как конечный класс Math, который вы используете в java. Singleton также использует частный конструктор

Ответ 9

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

Почему вы хотите, чтобы объекты вашего класса создавались только внутри? Это может быть сделано по любой причине, но одна из возможных причин заключается в том, что вы хотите реализовать синглтон. Синглтон - это шаблон дизайна, который позволяет создавать только один экземпляр вашего класса, и это можно выполнить с помощью частного конструктора.

Ответ 10

Да, и он используется для предотвращения создания экземпляра и последующего переопределения. Это чаще всего используется в одноэлементных классах.

Ответ 11

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

public class CustomHttpClient {
private static HttpClient customHttpClient;

/** A private Constructor prevents any other class from instantiating. */
private CustomHttpClient() {
}}

Ответ 12

Да. Класс может иметь частный конструктор. Даже абстрактный класс может иметь частный конструктор.

Сделав конструктор закрытым, мы препятствуем созданию экземпляра класса, а также подклассу этого класса.

Вот некоторые из использования частного конструктора:

Ответ 13

Частные конструкторы запрещают явным образом создавать экземпляры класса вызывающими см. дополнительную информацию о PrivateConstructor

Ответ 14

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

Ответ 15

По мне, мы можем объявить конструктор как частный, а также мы может получить экземпляр этого класса в подклассе, используя статический метод в классе, в котором мы объявляем конструктор, а затем возвращаем объект класса. мы классифицируем этот метод из подкласса используя classname.method имя bcz, это статический метод, и мы получим экземпляр класса, в котором мы объявляем const.