Як зазначають інші, приватні змінні добре уникати пропусків, що призводять об'єкт до непослідовного стану та важко відслідковувати помилки та непередбачувані винятки.
Але з іншого боку, те, що в основному ігнорували інші, стосується захищених полів.
Розширений підклас матиме повний доступ до захищених полів, що робить об'єкт таким тендітним, як ніби такі поля є загальнодоступними, але ця крихкість обмежується самим розширюваним класом (якщо він ще більше не відкрив такі поля).
Отже, загальнодоступні поля важко вважати хорошими, і на сьогоднішній день єдиною причиною їх використання є класи, які використовуються як параметр конфігурації (дуже простий клас з багатьма полями і без логіки, тому цей клас передається як параметр лише якийсь метод).
Але з іншого боку, приватні поля знижують гнучкість вашого коду для інших користувачів.
Гнучкість проти проблем, плюсів і мінусів:
Об'єкти, створені вашим кодом у класі ванілі із захищеними полями, є безпечними і ви несете виключну відповідальність.
З іншого боку, об’єкти, що розширюють ваш клас із захищеними полями, інстанційними користувачами вашого коду, є їх відповідальністю, а не вашою.
Отже, не добре задокументовані захищені поля / методи, або якщо користувачі не дуже розуміють, як такі поля та методи повинні використовуватися, мають хороші шанси завдати непотрібних неприємностей собі і вам.
З іншого боку, зробити більшість речей приватними знизить гнучкість користувачів і, можливо, навіть відмовить від них шукати підтримувані альтернативи, оскільки вони, можливо, не захочуть створювати та підтримувати вилку лише для того, щоб справи відбувались по-своєму.
Отже, хороший баланс між приватним, захищеним та громадським - це те, що дійсно має значення.
Тепер вирішити питання між приватним та захищеним - справжня проблема.
Коли користуватися захищеним?
Щоразу, коли ви розумієте, поле може бути дуже гнучким, воно має бути закодовано як захищене. Ця гнучкість полягає: від того, щоб стати null (де null завжди перевіряється і визнається дійсним станом, не викидаючи винятки), до обмеження перед тим, як використовувати його клас вашого колишнього. > = 0, <100 і т.д.
Отже, для такого захищеного поля ви можете створити геттер і використовувати його тільки (замість прямого використання змінної поля), тоді як інші користувачі можуть не використовувати його, якщо вони хочуть більшої гнучкості до свого конкретного коду, у моєму прикладі це може бути : якщо вони хочуть, щоб негативні значення працювали нормально в розширеному класі.