Позвольте мне предвосхитить это, сказав, что я говорю в первую очередь о доступе к методам здесь и, в несколько меньшей степени, отмечая классы как final, а не членский доступ.
Старая мудрость
"отметьте это как частное, если у вас нет веских причин не делать этого"
Это имело смысл в те дни, когда оно было написано, до того, как открытый исходный код доминировал в пространстве библиотеки для разработчиков и в зависимости от VCS / mgmt. благодаря сотрудничеству с Github, Maven и т. д. стали сотрудничать друг с другом. Тогда еще можно было заработать, ограничивая способ (ы) использования библиотеки. Я провел, вероятно, первые 8 или 9 лет моей карьеры, строго придерживаясь этой «лучшей практики».
Сегодня я считаю, что это плохой совет. Иногда есть разумный аргумент для обозначения метода private или final класса, но он встречается крайне редко, и даже тогда он, вероятно, ничего не улучшает.
Вы когда-нибудь:
- Были разочарованы, удивлены или обижены библиотекой и т. Д., В которой была ошибка, которая могла быть исправлена с помощью наследования и нескольких строк кода, но из-за закрытых / финальных методов и классов пришлось ждать официального патча, который может никогда не появиться? У меня есть.
- Хотели использовать библиотеку для немного другого варианта использования, чем предполагали авторы, но не смогли этого сделать из-за закрытых / финальных методов и классов? У меня есть.
- Были разочарованы, удивлены или обижены библиотекой и т. Д., Которая была чрезмерно разрешительной в своей расширяемости? Я не.
Вот три самых больших объяснения, которые я слышал о пометке методов private по умолчанию:
Рационализация № 1: это небезопасно и нет причин переопределять определенный метод
Я не могу сосчитать, сколько раз я ошибался в том, будет ли когда-либо необходимость переопределять определенный метод, который я написал. Проработав несколько популярных библиотек с открытым исходным кодом, я с трудом узнал истинную стоимость маркировки вещей частными. Это часто исключает единственное практическое решение непредвиденных проблем или вариантов использования. И наоборот, я никогда за более чем 16 лет профессионального развития не сожалел о том, что помечал метод, защищенный вместо частного, по причинам, связанным с безопасностью API. Когда разработчик решает расширить класс и переопределить метод, он сознательно говорит: «Я знаю, что я делаю». и ради производительности этого должно быть достаточно. период. Если это опасно, обратите внимание на класс / метод Javadocs, а не просто слепо захлопните дверь.
Методы маркировки, защищенные по умолчанию, - это смягчение одной из основных проблем в разработке современных ЕО: провал воображения.
Рационализация № 2: поддерживает чистоту публичного API / Javadocs
Это более разумно, и, в зависимости от целевой аудитории, это может быть даже правильным решением, но стоит подумать, какова стоимость поддержания чистоты API на самом деле: расширяемость. По причинам, указанным выше, вероятно, имеет смысл пометить объекты, защищенные по умолчанию, на всякий случай.
Рационализация № 3: Мое программное обеспечение является коммерческим, и мне нужно ограничить его использование.
Это тоже разумно, но, как потребитель, я бы каждый раз шел с менее строгим конкурентом (при условии, что существенных различий в качестве не существует).
Никогда не говори никогда
Я не говорю, никогда не отмечайте методы как частные. Я говорю, что лучшее эмпирическое правило - «защищать методы, если нет веских причин не делать этого».
Этот совет лучше всего подходит для тех, кто работает с библиотеками или крупномасштабными проектами, разбитыми на модули. Для небольших или более монолитных проектов это не имеет большого значения, так как вы все равно контролируете весь код, и легко изменить уровень доступа к коду, если / когда вам это нужно. Хотя и тогда я бы дал тот же совет :-)