是的,一个构造函数可以是私有的。这有不同的用途。一个这样的用途是
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,当实现需要更大数量的依赖或其他形式的上下文)。
>当有多种不同的方式来创建对象时,私有构造函数可以使得更容易理解构造它的不同方式(例如,对于新的ArrayList(5)或ArrayList.createWithCapacity(5),ArrayList .createWithContents(5),ArrayList.createWithInitialSize(5))。换句话说,私有构造函数允许你提供其名字更容易理解的工厂函数,然后使构造函数私有,确保人们只使用更不明显的名字。这也通常用于the builder pattern.例如:
MyClass myVar = MyClass
.newBuilder()
.setOption1(option1)
.setOption2(option2)
.build();