Да, конструктор может быть приватным. Есть разные варианты использования этого. Одно из таких применений - 1005 *, который я бы советовал вам не использовать. Другое, более законное использование, заключается в делегировании конструкторов; у вас может быть один конструктор, который принимает множество различных опций, что на самом деле является деталью реализации, поэтому вы делаете его закрытым, но тогда оставшиеся конструкторы делегируют его.
В качестве примера делегирования конструкторов, следующий класс позволяет вам сохранять значение и тип, но он позволяет делать это только для подмножества типов, поэтому необходимо сделать общий конструктор частным, чтобы гарантировать, что только разрешенные типы используются. Общий частный конструктор помогает повторно использовать код.
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)
). Другими словами, приватный конструктор позволяет вам предоставлять фабричные функции, имена которых более понятны, а затем делает конструктор приватным, чтобы люди использовали только более очевидные имена. Это также обычно используется с шаблоном построителя . Например:
MyClass myVar = MyClass
.newBuilder()
.setOption1(option1)
.setOption2(option2)
.build();