2013-03-25 2 views
4

В Java у нас есть четыре спецификатора доступа: public, protected, package-private (по умолчанию) и private. Это wellknown и не проблема для меня.Почему «защищенный» Java менее защищен, чем по умолчанию?

Мой вопрос касается наименования protected. Как показано в the table here, поле дает спецификатору доступа по умолчанию для private-private препятствует использованию подклассов вне пакета, но применение ключевого слова protected фактически не защищает его –, наоборот, оно открывает его для подклассов любых пакет.

Итак, почему не protected защищает вещи; почему это нет ограничительный, чем никакой модификатор?

+0

Он защищен по сравнению с общедоступными ... –

+6

'public',' protected' и 'private' уровни доступа копируются из C++. Пакет private уникален для Java. Я предполагаю, что они использовали те же имена, что и C++, чтобы быть знакомыми и не хотели добавлять синтаксис для уровня пакета. – zch

+0

Вы можете задать тот же вопрос, если были защищены по умолчанию. Я не понимаю, почему это проблема – 75inchpianist

ответ

1

Защищенный является более ограничительным, чем общедоступным. Вот почему это называется тем, чем оно является.

Желательно, чтобы разработчики языка назвали спецификатор доступа по умолчанию «защищенным пакетом», потому что по умолчанию это очень запутанно для многих программистов. Я был бы более заинтересован в том, чтобы защищенный был по умолчанию, или не имеет значения по умолчанию.

6

Если мы согласны с тем, что это четыре уровня доступа, которые должны существовать (частные, пакетные, пакетные, private-plus-subclasses и public), и мы принимаем, что пакет-частный должен быть уровень доступа по умолчанию, когда вы не указываете что-то еще, тогда возникает вопрос: «Почему пакет-private-plus-subclasses называется protected?» И ответ на этот вопрос заключается в том, что он заимствовал/унаследовал термин из C++ (который не делает 'есть концепция «пакетов», но использует protected означает «частные плюс-подклассы»).

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

3

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

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

+0

У вас есть ссылка на это? Я не помню, чтобы прочитать его в 1.0 Java Language Specification, но это было давно. – jbindel

+0

У меня возникли проблемы с поиском прочной спецификации, но есть следующее: http://journals.ecs.soton.ac.uk/java/tutorial/java/javaOO/accesscontrol.html – Aurand

+0

Спасибо! Там также указано, что он был добавлен в 1.0.2, а не в более ранних версиях. http://www.jguru.com/faq/view.jsp?EID=15576 – jbindel