В Java я иногда вижу конструктор, объявленный как «общедоступный», а иногда у него нет модификатора доступа, что означает, что он является закрытым для пакета. В каких случаях я должен использовать один над другим и наоборот?
Когда конструктор должен быть объявлен общедоступным, а когда — пакетно-приватным?
Ответы (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();
}
Модификаторы применяются к конструктору так же, как поля и метод.
- Если это
public
, любой класс может получить доступ и увидеть его. - Если это
private
, никакой другой класс вне этого класса не может получить доступ или видеть его.
Подробнее об управлении доступом читайте в документации
Обычно конструкторы создаются private
при использовании шаблона Factory или шаблона Singleton.
private
конструкторов для шаблона Factory? Вы имеете в виду методы статической фабрики [создания], а не абстрактную фабрику GoF (обычно просто называемую фабрикой) и фабричные методы.
- person Tom Hawtin - tackline; 30.12.2010
«Package private» (доступ по умолчанию), несмотря на то, что он используется по умолчанию, редко является хорошим выбором, кроме как для внешнего класса/интерфейса/перечисления. Это было бы уместно для абстрактного класса с фиксированным набором подклассов (в том же пакете), что-то вроде конструктора enum
в том же перечислении. Если внешний тип является закрытым для пакета, вы можете также оставить открытые конструкторы и члены общедоступными, а не более экзотический модификатор доступа.