Почему protected в Java работает именно так?

Сразу скажу, что основной язык у меня C#, поэтому мыслю в его парадигме.
Там модификаторы доступа работают аналогично Java, за исключением protected. В C# он означает "доступен только в классе и его потомках", а неймспейс (некий аналог пакета в Java) роли не играет. Т.е. получается этакий "private для меня и потомков".

Т.е. сценарии такие:
1. Нужен доступ вообще отовсюду - пиши public.
2. Нужен доступ только внутри класса - пиши private.
3. Нужен доступ только внутри класса и потомках - пиши protected.
4. Нужен доступ отовсюду, но только в пределах неймспейса ("пакета") - пиши internal.

В Java же protected - это доступ всем в том же пакете, а в других пакетах - только потомкам.
Я не могу понять, какой смысл давать полный доступ всем в таком же пакете? Получается у нас выпадает сценарий 3.

Например, я хочу создать класс Сотрудник (с потенциальными подклассами АутсорсСотрудник, СвойСотрудник), у него поля Имя, Фамилия. Хочу, чтобы они наследовались, значит я должен объявить их как protected. Но тогда они станут видны извне самих классов и условный класс X, получив ссылку на сотрудника, сможет ему изменить поле Имя или Фамилия напрямую, в обход методов-сеттеров.

В общем сейчас для меня такой protected выглядит абсурдным. Объясните, в чем дело, почему он именно такой?
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 2
xez
@xez Куратор тега Java
TL Junior Roo
Но тогда они станут видны извне самих классов и условный класс X...

Этот "условный класс X" - все таки, не какой-то случайный класс, а класс из того же пакета.
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
ну твой класс сотрудника и его наследники могут быть не публичными т.ч. будут доступны только внутри пакета и наследников.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы