Автор: Widowmaker1984

Вопросы 29, 32 (модификаторы прав доступа)

"Как правильно организовать доступ к полям класса?"
"Какие модификации уровня доступа вы знаете, расскажите про каждый из них."


1. Модификаторы — ключевые слова, которые добавляются при инициализации для изменения значений. Язык Java имеет широкий спектр модификаторов, основные из них:
- модификаторы доступа;
- модификаторы класса, метода, переменной и потока, используемые не для доступа.

2. В Java существуют следующие модификаторы доступа:
- private: члены класса доступны только внутри класса;
- default (package-private) (модификатор, по-умолчанию): члены класса видны внутри пакета (если класс будет так объявлен он будет доступен только внутри пакета);
- protected: члены класса доступны внутри пакета и в наследниках;
- public: члены класс доступны всем;

скрытый текст2.1. Последовательность модификаторов по убыванию уровня закрытости: private, default, protected, public.

2.2. Во время наследования возможно изменения модификаторов доступа в сторону большей видимости. Так сделано для того, чтобы не нарушался принцип LSP («подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс») для наследуемого класса.

2.2.1. Поэтому методы, объявленные как public в суперклассе, также должны быть public во всех подклассах. Методы, объявленные как protected в суперклассе, должны либо быть либо protected, либо public в подклассах; они не могут быть private. Методы, объявленные как private для всех не наследуются, так что нет никакого правила для них.

3. Переменная или метод, объявленные без модификатора контроля доступа доступны для любого другого класса в том же пакете.

3.1. При этом поля в интерфейсе неявно являются public, static, final, а методы в интерфейсе по умолчанию являются public.

4. Модификатор private — методы, переменные и конструкторы, которые объявлены как private в Java могут быть доступны только в пределах самого объявленного класса. Модификатор доступа private является наиболее ограничивающим уровенем доступа. Использование этого модификатора в Java является основным способом, чтобы скрыть данные.

4.1.Классы (исключая внутренние) и интерфейсы не могут быть private.

4.2. Переменные, объявленные как private, могут быть доступны вне класса, если получающие их открытые (public) методы присутствуют в классе. Например, пусть переменная format класса Logger является private, так что нет никакого способа для других классов, чтобы получить и установить её значение напрямую. Но можно определить два открытых (public) метода: getFormat(), который возвращает значение format, и setFormat(String), который устанавливает её значение.

5. Модификатор public — класс, метод, конструктор, интерфейс и т.д. объявленные как public могут быть доступны из любого другого класса. Поэтому поля, методы, блоки, объявленные внутри public класса могут быть доступны из любого класса. Благодаря наследованию классов, в Java все публичные (public) методы и переменные класса наследуются его подклассами.

5.1.Тем не менее, чтобы получить доступ к public классу в другом пакете, этот класс придется импортировать.

6. Модификатор protected — переменные, методы и конструкторы, которые объявляются как protected в суперклассе, могут быть доступны только для подклассов в другом пакете или для любого класса в пакете класса protected. Доступ protected дает подклассу возможность использовать вспомогательный метод или переменную, при этом не позволяя их использовать неродственным классам.

6.1. Модификатор доступа protected в Java не может быть применен к классу и интерфейсам. Методы и поля могут быть объявлены как protected, однако методы и поля в интерфейсе не могут быть объявлены как protected.

7. Почему бы не объявить все переменные и методы с модификатором public, чтобы они были доступны в любой точке программы вне зависимости от пакета или класса? Возьмем, например, поле age, которое представляет возраст. Если другой класс имеет прямой доступ к этому полю, то есть вероятность, что в процессе работы программы ему будет передано некорректное значение, например, отрицательное число. Подобное изменение данных не является желательным.

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

7.2. В теории часто рекомендуется использовать для полей модификатор доступа private, а доступ осуществлять через специальные методы с заголовками, начинающимися с get/set.

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)