Одна из первых вещей, которые я делаю, когда делаю подкласс класса, - это изменение группы частных методов на защищенные.
Некоторые рассуждения о private
против protected
методов :
private
методы предотвращают повторное использование кода. Подкласс не может использовать код в закрытом методе и может нуждаться в его повторной реализации или повторной реализации метода (ов), которые изначально зависят от закрытого метода & c.
С другой стороны, любой метод, который не private
может рассматриваться как API, предоставляемый классом «внешнему миру», в том смысле, что сторонние подклассы также рассматриваются как «внешний мир», как кто-то другой предложил в своем ответе. уже.
Это плохо? - Я так не думаю.
Конечно, (псевдо) публичный API блокирует первоначального программиста и препятствует рефакторингу этих интерфейсов. Но с другой стороны, почему программист не должен разрабатывать свои собственные «детали реализации» таким чистым и стабильным способом, как его общедоступный API? Должен ли он использовать private
так, чтобы он мог быть небрежным в структурировании своего "частного" кода? Думая, может быть, он мог бы почистить это позже, потому что никто не заметит? - нет
Программист должен также немного подумать о своем «частном» коде, чтобы структурировать его таким образом, чтобы это позволяло или даже способствовало повторному использованию как можно большего количества кода. Тогда не приватные части могут не стать таким бременем в будущем, как некоторые опасаются.
Много кода (фреймворка), который я вижу, принимает непоследовательное использование private
:, protected
обычно встречаются не финальные методы, которые делают только что-то большее, чем делегирование частному методу. protected
Неокончательные методы, чей контракт может быть выполнен только через прямой доступ к приватным полям.
Эти методы не могут быть логически переопределены / улучшены, хотя технически нет ничего, что могло бы сделать это (компилятором) очевидным.
Хотите расширяемость и наследование? Не делай свои методы private
.
Не хотите, чтобы определенное поведение вашего класса изменилось? Сделай свои методы final
.
Неужели ваш метод не может быть вызван вне определенного, четко определенного контекста? Сделайте свой метод private
и / или подумайте, как сделать требуемый четко определенный контекст доступным для повторного использования через другой protected
метод-обертку.
Вот почему я рекомендую использовать private
экономно. И не путать private
с final
. - Если реализация метода жизненно важна для общего контракта класса и, следовательно, не должна быть заменена / переопределена, сделайте это final
!
Для полей private
не очень плохо. До тех пор, пока поле (я) может быть разумно «использовано» с помощью соответствующих методов (это не так getXX()
или setXX()
!).