2017-01-04 10 views
0

Вот предложения, цитируемые из «Core Java»:Какой смысл защищенных полей в Java, так как он нарушает принцип инкапсуляции данных?

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

В результате я хотел бы знать, что точка защищенных полей находится в Java?

+4

http://softwareengineering.stackexchange.com/questions/162643/why-is-clean-code-suggesting-avoiding-protected-variables –

+0

Вы не должны относиться к сторонним книгам, как к Библии. – EJP

ответ

0

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

В качестве аналогии в деловом мире каждая сделка должна быть защищена некоторыми юридическими контрактами, и можно сказать, что она «обескуражена» заключать сделку без защиты какого-либо юридического контракта. Это было бы правдой, если бы стороны были разными субъектами бизнеса. Однако, очевидно, тот же принцип не может применяться, если стороны не являются субъектами предпринимательской деятельности, а членами одной семьи.

ООП об организации кода. И в разных ситуациях понадобятся разные принципы организации.

+0

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

0

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

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