Главная » Java » Управление доступом

0

Вообразите ситуацию, когда любой член любого класса или объекта способен напрямую обращаться к структурным элементам иного произвольно взятого класса (объекта). Вероятно, не стоит и доказывать, что восприятие, отладка и поддержка такого программного кода превратятся в поистине невыполнимую задачу. В подобном случае контракты, которые могут быть предусмотрены классами, не принимаются во внимание – любой фрагмент кода наделен правом беспрепятственного и бесконтрольного обращения ко всем полям без исключения. Одно из неоспоримых преимуществ объектно-ориентированного подхода к программированию состоит в поддержке концепции uнкаnсуляции, или сокрытия данных. Чтобы воплотить ее в жизнь, необходимы средства языка, позволяющие регламентировать, кто обладает доступом к членам класса или интерфейса либо к Классу или интерфейсу как таковому. Возможность инкапсуляции реализуется на Практике с помощью модификаторов доступа, применяемых по отношению К Классам и интерфейсам в целом и их членам в частности.

Все члены класса всегда доступны в контексте самого класса. Механизм Управления доступом к членам класса извне основан на использовании модификаторов доступа четырех различных категорий.

·      private. Методы класса, помеченные как private, доступны только в контексте этого класса.

·    package. Методы, объявленные без указания модификатора доступа, открыты для самого класса и классов, размещенных в том же пакете. Вопросы, связанные с созданием пакетов и соответствующими возможностями доступа, рассмотрены в главе 13.

·      protected. Методы, обозначенные с помощью служебного слова protected, доступны в пределах "родного" класса, классов того же Пакета и классов-наследников. Проблеме наследования (расширения) Классов посвящена глава 3.

·     public. Методы, объявленные как public, открыты во всех случаях, когда

доступен сам класс.

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

Важно понимать, что контроль доступа осуществляется на уровне классов (или интерфейсов), но не на уровне объектов. Это значит, что члены класса потенциально открыты для доступа, независимо от того, к какому именно объекту класса выполняется обращение в тот или иной момент. Позже мы проиллюстрируем сказанное примером – в разделе 2.6.5 этой главы (на странице 79) обсуждаются вопросы управления доступом с помощью методов класса.

Члены класса, помеченные посредством служебного словари public или protected, следует воспринимать как часть Контракта класса, поскольку они могут использоваться программным кодом, который находится вне вашей компетенции. После того как класс начал самостоятельное существование и обрел признание, изменение членов public и protected, затрагивающее, скажем, соглашения о сигнатурах или возвращаемых значениях, окажется практически невозможным. В то же время члены класса, обладающие признаком доступа уровня пакета или снабженные модификатором private, полностью скрыты от постороннего наблюдателя, и поэтому особенности их внутренней организации исключительная прерогатива автора класса.

Объявляя класс Body, мы пометили его поля модификатором public, поскольку, как мы в данный момент полагаем, программистам, которые обратятся к классу, понадобится доступ к его членам, чтобы использовать класс по его прямому назначению. Далее мы приведем обновленные версии класса Body, и вы убедитесь, что исходный дизайн далек от совершенства и поступать подобным образом, как правило, не следует.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии