Чому на Java не існує модифікатора доступу лише для підкласів?


17

У Java є чотири доступні модифікатори доступу для методів:

public - будь-який клас може використовувати цей метод.

protected - класи в одному пакеті і підкласи в будь-якому пакеті можуть використовувати цей метод.

private - лише цей клас може використовувати цей метод.

no modifier ("пакет приватний") - цей клас можуть використовувати лише класи в одному пакеті.

Часто трапляється те, що я хочу мати корисні методи у суперкласі, якими можуть користуватися всі підкласи. Але для інших класів не має сенсу звертатися до цього методу, і в певному сенсі це порушить інкапсуляцію.

Тому я маю задекларувати ці корисні методи у надкласі publicабо protected, що виставляє їх у всіх інших класах хоча б у пакеті. Хоча вони призначені лише для підкласів.

Чи є причина, чому subclasses-onlyна Java немає модифікатора доступу? Мені це здається дуже дивним. Я щось пропускаю?

Також subclasses-onlyмодифікатор доступу також буде корисний, коли ви хочете виставити змінні лише підкласам. Що зі мною трапляється багато.

Відповіді:


10

Оскільки ви можете імітувати модифікатор, призначений лише для підкласів , використовуючи захищений модифікатор і примушуючи до того, що лише батьківський клас та його підкласи містяться в одному пакеті.

Це справді хороша практика, оскільки пакети не лише допомагають організовувати великі проекти з точки зору згуртованості, але й показують, що класи в одному пакеті можуть мати певний рівень зв'язку.


15
"і примушувати, що тільки батьківський клас та його підкласи знаходяться в одному пакеті" - Тепер, як би це зробити ?!
JimmyB

1
І тоді ви не можете використовувати модифікатор доступу для пакета. І вам потрібна дурна кількість пакетів. Це не практичне рішення.
користувач253751

13

Java спочатку мала такий модифікатор. Це було написано, private protectedале видалено в Java 1.0.

Я припускаю, що це був судовий заклик, що додаткова складність не вартувала витрат.

Кожна мовна функція має вартість: викладання її новим програмістам; в документації; реалізуючи його в інструментах компілятора, JVM та dev; в міркуваннях про правильність програми; обмежуючи майбутню еволюцію мови; і більше. Мовні функції взаємодіють між собою, потенційно з N 2 взаємодіями.

Який відсоток програмістів Java прочитав специфікацію мови Java та специфікацію VM? Надіюсь, це невеликий відсоток, який стверджує, що ще простішою мовою є зрозумілість та інженерні продукти, від яких ми можемо залежати.

Користь цієї private protectedфункції була невеликою, оскільки пакет є основним модулем модульності.


1
значить, була версія Java до 1.0?
Марк Ісрі

1
@MarkYisri Java мали публічні альфа-та бета-версії в 1995 році, і проти них було написано неабиякий код.
Девід Молес

4

Контроль доступу можна вважати результатом розкриття уявного розробника, який працює з вашим класом над класовими методами та проспектами ...

ВИ: Скажіть, ви хочете зробити x, ви називаєте метод doX .. DEV: Скажіть мені більше ... які аргументи?

Це публічно ...

ВАС: Всередині doX я дзвоню ... DEV: Ой, надто багато інформації, мені це не байдуже. Я просто хочу знати, як ним користуватися. Скажи мені ще щось.

Це приватне ...

ВИ: Коли підкласифікуюсь, у мене є doX і doY call doIt, що робить .. DEV: Так, я буду підклас, скажи мені більше ...

Це захищено ...

ВАС: Я вирушаю у відпустку через годину, я піду протягом наступних 6 місяців. Бос каже, що цей щеня за вами! До побачення. DEV: Зачекайте, поки не піде, розкажи мені все ...

Це пакет.

ВИ: Метод doItWhen викликається лише цим класом, і він не змінився протягом десяти років. Це ... DEV: Ой, ми пішли на 50 хвилин. Наступна властивість, і говорити швидше.

Це захищене приватне ...


3

Це вже існує. Він захищений.

Ви маєте контроль над тим, які класи існують в пакеті. Якщо в пакеті немає іншого класу, і певна змінна чи метод захищені, це "лише підкласи".

Це знову ж таки, ви знову контролюєте, які класи існують в пакеті. Ви можете просто не використовувати захищені методи чи змінні.


3
Окрім певних зарезервованих системних пакетів, чи не можу я додати клас до жодного пакету, навіть до одного із ваших, до якого ви не збираєтесь додавати класи?
Девід Молес

@David IIRC так, але він не дозволить вам отримати доступ до полів пакета з іншого JAR, тому навіть якщо ви помістите його в той же пакет, якщо він знаходиться в іншому JAR, ви не можете отримати доступ до нього. Однак якщо ви посилаєтесь на один і той же JAR, тоді так, ви можете отримати доступ до нього, але якщо ви зможете змінити відповідну JAR, ви можете так само легко змінити модифікатор доступу.
Pokechu22

1
@ Pokechu22 Я думаю, що вам доведеться ствердно закріпити JAR, щоб отримати захист, але хороший пункт.
Девід Молес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.