Почему в Java нет модификатора видимости подкласса?

Не раз я обнаружил, что желаю переменную видимость, которая невозможна на 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 или по умолчанию. Является ли причина, по которой это не так важно, чтобы быть включенным, или она больше связана с возможными побочными эффектами, которые я не рассматривал?

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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