В Java я иногда вижу конструктор, объявленный как «общедоступный», и иногда он не имеет модификатора доступа, что означает, что он является закрытым пакетом. Каковы случаи, когда я должен использовать один над концом и наоборот?Когда конструктор должен быть объявлен открытым и когда он должен быть приватным к пакету?
ответ
Модификаторы применяются к конструктору так же, как поля и метод.
- Если
public
, любой класс может доступ и см его. - Если это
private
, нет другого класса вне этого класса может Доступ или см. it.
Read more about access control at documentation
Обычно конструкторы сделаны private
при использовании Factory шаблон или шаблон Singleton
вопрос содержит ответ. Сделать конструктор общедоступным, если вы разрешаете свой код клиента за пределами пакета создавать экземпляр объекта. Если вы этого не хотите (поскольку объект специфичен для пакета или сам объект не может быть создан непосредственно), используйте 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();
}
«Пакет частный» (доступ по умолчанию), несмотря на то, по умолчанию, редко хороший выбор другой, чем на внешнем интерфейсе класса// перечисление. Это было бы уместно для абстрактного класса с фиксированным набором подклассов (в том же пакете), немного похожим на конструктор enum
в том же перечислении. Если внешний тип является закрытым пакетом, вы можете оставить публичные конструкторы и члены публичными, а не более экзотическим модификатором доступа.
- 1. UTL_RECOMP.RECOMP_SERIAL должен быть объявлен
- 2. Компонент должен быть объявлен
- 3. Должен быть объявлен?
- 4. Как установить счетчик циклов while? Когда он должен быть 1, а когда он должен быть 0?
- 5. undefined объект jQuery, когда он должен быть
- 6. Строка удалена, когда он не должен быть
- 7. должен ResultSet быть открытым
- 8. onBindViewHolder должен быть объявлен абстрактным
- 9. элемент LinearLayout должен быть объявлен
- 10. Элемент RelativeLayout должен быть объявлен
- 11. Когда должен быть статический метод?
- 12. Когда член класса должен быть объявлен виртуальным (C#)/Overridable (VB.NET)?
- 13. Когда и где должен быть выпущен CTCallCenter?
- 14. URL-адрес показывает, когда он перетащил, он должен быть скрыт
- 15. PLS-00201: идентификатор 'TYPE' должен быть объявлен
- 16. Идентификатор должен быть объявлен? PL/SQL ошибка
- 17. Java: почему отдельный класс должен быть приватным
- 18. PLS-00201: идентификатор 'D' должен быть объявлен
- 19. PLS-00201: идентификатор UTIL_FILE должен быть объявлен
- 20. PLS-00201 Идентификатор должен быть объявлен
- 21. «Идентификатор должен быть объявлен» при использовании функции
- 22. Почему вложенный тип должен быть явно объявлен?
- 23. Должен ли BroadcastReceiver быть объявлен внутри деятельности?
- 24. Идентификатор 'input' должен быть объявлен - PL SQL
- 25. должен быть объявлен как имя файла
- 26. Почему список должен быть объявлен окончательным
- 27. Текст над написанным, когда он должен быть добавлен
- 28. Идентификатор Oracle 'myschema.mytable должен быть объявлен'
- 29. Почему printf() дает случайный выход, когда он должен быть 0?
- 30. Включить запуск события, когда он не должен быть jquery
В частности, см. Раздел «Советы по выбору уровня доступа». – Raedwald
'частные' конструкторы для шаблона« Factory »? Вы имеете в виду статические фабричные методы [создания], а не GoF Abstract Factory (обычно называемые фабрикой) и Factory Methods. –
@ Тома да Статический шаблон фабрики –