Почему в Java нет модификатора видимости подкласса? - PullRequest
67 голосов
/ 14 марта 2011

В более чем одном случае я обнаружил, что желаю иметь переменную видимость, которая невозможна в Java. Я хотел, чтобы некоторые члены были видны в своем собственном классе и в любых подклассах, но не для остальной части пакета или для остального мира. Другими словами, я хотел этого:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

Однако дизайнеры Java дали мне this :

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

Типичный случай, когда я хочу что-то подобное, это когда создается абстрактный класс. Иногда я нахожу, что абстрактному родителю нужен доступ к определенным членам, но конкретным детям тоже. Я могу дать им этот доступ, сделав членов protected, но это открывает доступ к остальной части пакета, когда я действительно не хочу.

Чтобы быть полностью ясным, я знаю, что такой модификатор не возможен в Java. У меня вопрос, почему такой модификатор не включен в Java? Мне кажется (для меня) это более естественный уровень видимости, чем protected или по умолчанию. Является ли причина, по сути, недостаточной для включения, или она связана с возможными побочными эффектами, которые я не учел?

Ответы [ 3 ]

18 голосов
/ 14 марта 2011

Я полагаю, что они хотят избежать дополнительной сложности, имея нелинейную иерархию доступа.

Вы должны иметь контроль над своим пакетом, поэтому просто не вызывайте эти защищенные методы там.

(Кстати, protected не совсем то же самое, что и sub-class and package, так как нестатические защищенные методы (если не в одном и том же пакете) не могут быть вызваны для произвольных объектов декларирующего класса, но только дляобъекты подкласса, в котором находится код. (Вы можете увидеть это на Object.clone(), который может вызываться только классом, чей объект клонируется.))

6 голосов
/ 14 марта 2011

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

3 голосов
/ 14 марта 2011

Вы должны поместить свой класс в собственный пакет и пометить член (переменную экземпляра или метод) как защищенный. Таким образом, никакие другие классы, кроме подклассов, не могут получить доступ к тому члену, который вы продаете как защищенный. В итоге вы получите один класс в одном пакете, если вы отчаянно хотите, чтобы только подклассы имели доступ к этому защищенному члену.

...