繁体   English   中英

什么时候应该将构造函数声明为public,何时应该是package-private?

[英]When should a constructor be declared public and when should it be package-private?

在Java中,我看到有时构造函数声明为'public',有时它没有访问修饰符,这意味着它是package-private。 我必须使用一个以上的情况,反之亦然?

这个问题包含了答案。 如果允许包外的客户端代码实例化对象,请将构造函数设置为public。 如果您不希望这样(因为对象是特定于包的,或者对象本身无法直接实例化),请使用package-private。

例如,如果你有一个应该使用Car (这是一个接口)的客户端代码,而某些包com.company.cars包含实现Car接口( BMW, WV, Opel )等的类,那么你会而是有一个工厂,实例化必要的汽车实施。 因此,只有工厂才能访问构造函数。

public CarFactory {
  public Car getCar(CarType carType) {
    Car result = null;
    switch(carType) {
      case BMW:
        result = new BMW();
      case Opel:
        result = new Opel();
    }
    return result;
  } 
}

class BMW implements Car {
   // package-private constructor
   BMW();
}

修饰符适用于与字段和方法相同的构造函数。

  1. 如果它是public ,任何类都可以访问查看它。
  2. 如果它是private ,那么该类之外的其他类都不能访问查看它。

阅读有关文档访问控制的更多信息

通常,在使用Factory模式或Singleton模式时,构造函数将变为private

“包私有”(默认访问),尽管是默认的,除了在外部类/接口/枚举之外,很少是一个好的选择。 它适用于具有固定子类集(在同一个包中)的抽象类,有点像同一枚举中的enum构造函数。 如果外部类型是包私有,那么您可以将公共构造函数和成员公开,而不是更奇特的访问修饰符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM