Когда конструктор должен быть объявлен общедоступным, а когда — пакетно-приватным?

В Java я иногда вижу конструктор, объявленный как «общедоступный», а иногда у него нет модификатора доступа, что означает, что он является закрытым для пакета. В каких случаях я должен использовать один над другим и наоборот?


person Jon    schedule 30.12.2010    source источник


Ответы (3)


Вопрос содержит ответ. Сделайте конструктор общедоступным, если вы позволяете своему клиентскому коду вне пакета создавать экземпляр вашего объекта. Если вы этого не хотите (поскольку объект зависит от пакета или сам объект не может быть создан напрямую), используйте 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();
}
person Vladimir Ivanov    schedule 30.12.2010

Модификаторы применяются к конструктору так же, как поля и метод.

  1. Если это public, любой класс может получить доступ и увидеть его.
  2. Если это private, никакой другой класс вне этого класса не может получить доступ или видеть его.

Подробнее об управлении доступом читайте в документации

Обычно конструкторы создаются private при использовании шаблона Factory или шаблона Singleton.

person jmj    schedule 30.12.2010
comment
В частности, см. раздел Советы по выбору уровня доступа. - person Raedwald; 30.12.2010
comment
private конструкторов для шаблона Factory? Вы имеете в виду методы статической фабрики [создания], а не абстрактную фабрику GoF (обычно просто называемую фабрикой) и фабричные методы. - person Tom Hawtin - tackline; 30.12.2010
comment
@Tom yes Статический заводской шаблон - person jmj; 30.12.2010

«Package private» (доступ по умолчанию), несмотря на то, что он используется по умолчанию, редко является хорошим выбором, кроме как для внешнего класса/интерфейса/перечисления. Это было бы уместно для абстрактного класса с фиксированным набором подклассов (в том же пакете), что-то вроде конструктора enum в том же перечислении. Если внешний тип является закрытым для пакета, вы можете также оставить открытые конструкторы и члены общедоступными, а не более экзотический модификатор доступа.

person Tom Hawtin - tackline    schedule 30.12.2010