是的,构造函数可以是私有的。有不同的用途。一种这样的用法是用于单例设计反模式,我建议你不要使用它。另一个更合理的用法是委派构造函数。你可以让一个构造函数接受很多不同的选项,而这些选项实际上是实现细节,因此你将其设为私有,但是其余的构造函数将委托给它。
作为委派构造函数的示例,以下类允许你保存值和类型,但仅允许你对类型的子集进行保存,因此需要将常规构造函数设为私有以确保仅使用允许的类型。通用私有构造函数有助于代码重用。
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();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)