当前位置: 首页 > 面试题库 >

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

孔欣可
2023-03-14
问题内容

构造函数可以私有吗?私有构造函数有什么用?


问题答案:

是的,构造函数可以是私有的。有不同的用途。一种这样的用法是用于单例设计反模式,我建议你不要使用它。另一个更合理的用法是委派构造函数。你可以让一个构造函数接受很多不同的选项,而这些选项实际上是实现细节,因此你将其设为私有,但是其余的构造函数将委托给它。

作为委派构造函数的示例,以下类允许你保存值和类型,但仅允许你对类型的子集进行保存,因此需要将常规构造函数设为私有以确保仅使用允许的类型。通用私有构造函数有助于代码重用。

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();


 类似资料:
  • 问题内容: 构造函数可以是私有的吗?私有构造函数有何用处? 问题答案: 是的,构造函数可以是私有的。这有不同的用途。一个这样的用途是用于singleton设计反模式,我建议您不要使用它。另一个更合法的用法是委托构造函数;您可以有一个构造函数,它接受许多不同的选项,这实际上是一个实现细节,所以您将其设为私有,但剩余的构造函数将其委托给它。 作为委托构造函数的一个例子,下面的类允许您保存一个值和一个类

  • 我试图理解为什么在谈到构造函数时,类成员的可访问性之间存在差异。 考虑下面的例子: 的私有成员作为私有成员,不应从访问。对于字段和方法,情况确实如此,但构造函数似乎没有遵循相同的规则。 从JLS-8(6.6.1.确定可访问性)中,我们可以阅读: [...] 引用类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明该成员或构造函数允许访问时才可访问: > [……] 否则,成员或

  • 问题内容: 假设有一个类,其所有构造函数都声明为private。 例如。: 据我所知,将所有构造函数设为私有类似于将类“ This”声明为 final ,因此无法进行扩展。 但是,我收到的Eclipse消息给我的印象是这是可能的-可以扩展全构造函数私有类。看看这个: 当我尝试使用类似的方法扩展此类时 Eclipse给了我一个错误:“ 隐式超级构造函数This()对于默认构造函数不可见。必须定义一个

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。

  • 问题内容: 抽象类可以有构造函数吗? 如果是这样,它将如何使用以及用于什么目的? 问题答案: 是的,抽象类可以具有构造函数。考虑一下: 超类是抽象的,并且具有构造函数。具体的类具有仅对值2进行硬编码的构造函数。具体的类具有允许调用者指定值的构造函数。 抽象构造函数将经常用于强制类约束或不变量,例如设置类所需的最小字段。

  • 问题内容: 由于枚举构造函数只能由其常量调用,因此为什么要允许它成为包私有的? 问题答案: 构造函数实际上不是包私有的…隐式地意味着接口方法是隐式的,即使您不添加关键字也是如此。 JLS(第8.8.3节)的相关部分规定: 如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。 如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为。 如果枚举类型(第8.9节)的构造函数声明为或