在Java中,我有时看到构造函数声明为“public”,有时却没有访问修饰符,这意味着它是程序包私有的。在什么情况下我必须使用“over over”,反之亦然?

最佳答案

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

例如,如果您的客户端代码应使用Car(这是一个接口),并且某些软件包com.company.cars包含一些类,这些类实现了Car接口(BMW, WV, Opel),依此类推,那么您宁愿有一个工厂来实例化必要的Car实施。因此,只有工厂才能访问构造函数。

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

07-24 09:15