Как утверждают другие, закрытые переменные хороши для того, чтобы избежать неправильного использования, приводящего объект в противоречивое состояние, и трудно отслеживать ошибки и непредвиденные исключения.
Но с другой стороны, то, что в основном игнорируется другими, касается защищенных полей.
Расширенный подкласс будет иметь полный доступ к защищенным полям, делая объект таким хрупким, как если бы такие поля были общедоступными, но эта хрупкость ограничивается самим расширяющим классом (если только он не раскрывает такие поля еще больше).
Таким образом, публичные поля трудно считать хорошими, и на сегодняшний день единственная причина их использования - для классов, используемых в качестве параметра конфигурации (очень простой класс со многими полями и без логики, так что класс передается как один параметр в какой-то метод).
Но, с другой стороны, приватные поля снижают гибкость вашего кода для других пользователей.
Гибкость против неприятностей, плюсы и минусы:
Объекты, созданные вашим кодом в классе vanilla с защищенными полями, являются безопасными и являются вашей исключительной ответственностью.
С другой стороны, объекты, расширяющие ваш класс защищенными полями, созданными пользователями вашего кода, являются их ответственностью, а не вашей.
Таким образом, плохо документированные защищенные поля / методы, или если пользователи не совсем понимают, как такие поля и методы следует использовать, имеют хорошие шансы создать ненужные проблемы для себя и для вас.
С другой стороны, закрытие большинства вещей снизит гибкость пользователей и может даже увести их в сторону поиска альтернативных вариантов, поскольку они могут не захотеть создавать и поддерживать развилки только для того, чтобы все происходило по-своему.
Таким образом, хороший баланс между частным, защищенным и публичным - вот что действительно имеет значение.
Теперь решить между частным и защищенным является реальной проблемой.
Когда использовать защищенный?
Каждый раз, когда вы понимаете, что поле может быть очень гибким, оно должно быть закодировано как защищенное. Эта гибкость заключается в следующем: от обнуления (когда ноль всегда проверяется и распознается как допустимое состояние без исключений) до наличия ограничений перед использованием вашим классом ex. > = 0, <100 и т. Д. И автоматически исправляется для значений превышения / недостаточности потока, выдавая самое большее предупреждающее сообщение.
Таким образом, для такого защищенного поля вы можете создать геттер и использовать его только (вместо непосредственного использования переменной поля), в то время как другие пользователи могут не использовать его, если они хотят большей гибкости для своего конкретного кода, в моем примере это может быть : если они хотят, чтобы отрицательные значения работали нормально в их расширенном классе.