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

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

218
задан Rajesh 12 May 2010 в 21:45
поделиться

9 ответов

Да.

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

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

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

16
ответ дан 23 November 2019 в 04:13
поделиться

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

1
ответ дан 23 November 2019 в 04:13
поделиться

Да, и это используется для предотвращения инстанцирования и последующего переопределения. Чаще всего это используется в классах-одноклассниках.

2
ответ дан 23 November 2019 в 04:13
поделиться

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

0
ответ дан 23 November 2019 в 04:13
поделиться

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

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

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

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

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

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

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

     MyClass myVar = MyClass 
     .newBuilder () 
     .setOption1 (option1) 
     .setOption2 (option2) 
     .build (); { {1}} 
146
ответ дан 23 November 2019 в 04:13
поделиться

Да.

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

5
ответ дан 23 November 2019 в 04:13
поделиться

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

25
ответ дан 23 November 2019 в 04:13
поделиться

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

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

    • синглтон
    • фабричный метод
    • класс только для статических методов (утилита)
    • класс только для констант
      . .
  • для предотвращения субклассификации (расширения). Если вы сделаете только приватный конструктор, ни один класс не сможет расширить ваш класс, потому что он не сможет вызвать super() конструктор. Это своего рода синоним final

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

92
ответ дан 23 November 2019 в 04:13
поделиться

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

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

  2. Это не позволяет классу быть подклассом

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

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

6
ответ дан 23 November 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: