Защищенные поля Java по сравнению с общедоступными методами get

Что является лучшей практикой и почему: доступ к переменным базового класса через защищенное поле или общедоступного метода get на частном поле.

(Метод get будет общедоступен невнимательный),

59
задан DD. 17 February 2010 в 09:58
поделиться

5 ответов

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

Лично мне нравится, чтобы все мои поля были закрытыми: это обеспечивает более четкое разделение между API и реализацией. Я считаю отношения между суперклассом и подклассом аналогичными отношениям между вызывающим и вызываемым - изменения в базовой реализации не должны разрушать подклассы не больше, чем они должны разрушать вызывающих. Имя поля - это деталь реализации, которая не должна влиять на другие классы.

По общему признанию, моя точка зрения иногда воспринимается как несколько крайняя ...

62
ответ дан 24 November 2019 в 18:24
поделиться

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

Причина проста. Когда-нибудь в будущем вы или кто-то другой, возможно, захотите изменить реализацию. Это всегда должно быть возможно. Если вы полагаетесь на переменную экземпляра, вы ограничиваете себя.

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

Если вы используете сеттеры / геттеры, вы всегда можете добавить валидацию, проверку и т. Д. Позже. Вы также можете предоставить только геттер, чтобы сделать переменную доступной только для чтения.

16
ответ дан 24 November 2019 в 18:24
поделиться

Некоторые из рекомендаций Sun по контролю доступа к полям здесь. Обратите внимание, что создание защищенного поля также делает его доступным для пакета, а не только для подклассов. Как правило, как указано в приведенной выше ссылке, поля должны быть закрытыми, если нет веской причины не делать этого.

6
ответ дан 24 November 2019 в 18:24
поделиться

Доступ к защищенным полям из подкласса - один из способов, которыми наследование нарушает инкапсуляцию. По этой причине лучше использовать общедоступный API.

0
ответ дан 24 November 2019 в 18:24
поделиться

Прямой доступ к полю не является предпочтительным. Используйте общедоступные или защищенные сеттеры и геттеры.

Получатель не должен быть общедоступным - если вы хотите скрыть данные от «посторонних», но передать данные подклассам, используйте protected

10
ответ дан 24 November 2019 в 18:24
поделиться
Другие вопросы по тегам:

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