Зачем в java нужен protected конструктор?
Asked
Active
Viewed 1,530 times
2 Answers
6
protected конструктор позволяет запретить создание экземпляра базового класса. В производных классах этот конструктор будет доступен, а стало быть, можно будет создавать потомков.
Данный подход применим во многих ООП языках, не только в java.
αλεχολυτ
- 28,987
- 13
- 60
- 119
-
насколько я понимаю, не совсем позволяет запретить создание экземпляра базового класса, а создавать экземпляр базового класса напрямую именно этим конструктором. Класс вполне может иметь статическую функцию внутри, которой бы вызывался этот protected конструктор, либо вызывать этот конструктор из другого, публичного конструктора – Grundy Jul 01 '16 at 13:23
-
-
1@MaxArt, тем, что экземпляр класса все еще можно создать, экземпляр абстрактного класса - нельзя – Grundy Jul 01 '16 at 13:24
-
Было бы круто увидеть в ответе пару примеров того как можно это применить) – ЮрийСПб Jul 01 '16 at 13:27
-
А экземпляр класса с protected конструктором получается все таки можно создавать в классах того же пакета? – Max Art Jul 01 '16 at 13:35
-
@MaxArt, протектед влияет только на то, что нельзя сделать
new MyClass()- нигде вне класса или наследников, если конструктор без параметров протектед – Grundy Jul 01 '16 at 13:37 -
-
@Grundy все равно
нельзя сделать new MyClass() - нигде вне класса или наследников, если конструктор без параметров протектедне согласуется с тем, чтоможно создать...или я не улавливаю – Алексей Шиманский Jul 01 '16 at 13:42 -
@АлексейШиманский, внутри функции класса - можно вызвать, соответственно и создать, внутри наследника можно вызвать и соответственно создать, просто так внутри какого-то другого класса через
newсоздать нельзя – Grundy Jul 01 '16 at 13:44 -
Почему нельзя, если класс в котором создаем объект с protected конструктором находится в том же пакете, то можно или я не прав? – Max Art Jul 01 '16 at 13:53
-
-
Ну так я и попробовал)) Получается что в своем пакете можно создавать, а в стороннем уже нет. Я склоняюсь к мнению, что класс все таки нельзя создавать явно в рамках других пакетов, кроме ситуации с явным наследованием. А в текущем пакете создание не запрещено. Поэтому и возник вопрос. – Max Art Jul 01 '16 at 14:05
6
protected конструктор нужен для вызова его из наследников, но сокрытия от доступа извне.
Отличный пример - protected конструктор класса Throwable.
Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
Последний параметр указывает, нужно ли писать стектрейс (что является очень затратной операцией). Можно наследоваться от Throwable и, вызывая этот конструктор родителя, получать очень легковесные "сигнальные" исключения.
Grundy
- 81,538
Nikolay Romanov
- 643
-
мне кажется или в первом предложении пропущены слова не только после "нужен" и и для после "но"? – Grundy Jul 01 '16 at 13:30
-
Я всё же склонен считать, что вам кажется. Предложение принимает немного другой окрас. – Nikolay Romanov Jul 01 '16 at 13:46
-