tangguo

Java中的构造函数可以是私有的吗?

java

构造函数可以是私有的吗?私有构造函数有何用处?


阅读 504

收藏
2020-10-16

共1个答案

小编典典

是的,构造函数可以是私有的。这有不同的用途。一个这样的用途是用于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;
     }
}

编辑

从几年后的答案来看,我想指出的是,这个答案既不完整,也有点极端。singleton确实是一种反模式,在可能的情况下应该避免使用;但是,除了singleton之外,私有构造函数还有很多用途,我的答案是只有一个。

再举几个使用私有构造函数的例子:

  1. 要创建一个不可实例化的类,它只是相关静态函数的集合(这基本上是一个单例的,但是如果它是无状态的,并且静态函数严格地操作参数而不是类状态,这并不像我之前所说的那样不合理,尽管使用依赖注入的接口通常在实现需要大量依赖项或其他形式的上下文时,更容易维护API)。

  2. 当有多种不同的方法来创建对象时,私有构造函数可以使您更容易理解构造对象的不同方法(例如,对于new ArrayList(5)或ArrayList.createWithCapacity(5) 你说,ArrayList.createWithContents(5) 你说,ArrayList.createWithInitialSize(5) )。换句话说,私有构造函数允许您提供名称更易于理解的工厂函数,然后将构造函数设为私有可以确保人们只使用更明显的名称。这也常用于构建器模式。例如:

MyClass myVar = MyClass
    .newBuilder()
    .setOption1(option1)
    .setOption2(option2)
    .build();
2020-10-16