2010-12-30 8 views
2

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

ответ

1

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

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

Read more about access control at documentation

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

+1

В частности, см. Раздел «Советы по выбору уровня доступа». – Raedwald

+0

'частные' конструкторы для шаблона« Factory »? Вы имеете в виду статические фабричные методы [создания], а не GoF Abstract Factory (обычно называемые фабрикой) и Factory Methods. –

+0

@ Тома да Статический шаблон фабрики –

2

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

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

Смежные вопросы