Jak stwierdzili inni, prywatne zmienne są dobre, aby uniknąć niewłaściwego użycia prowadzącego obiekt do niespójnego statusu i trudnego do śledzenia błędów i nieprzewidzianych wyjątków.
Ale z drugiej strony to, co inni ignorowali, dotyczy pól chronionych.
Rozszerzona podklasa będzie miała pełny dostęp do chronionych pól, dzięki czemu obiekt będzie tak delikatny, jak gdyby takie pola były publiczne, ale ta kruchość jest ograniczona do rozszerzającej się klasy (chyba że jeszcze bardziej odsłoniłby takie pola).
Tak więc pola publiczne trudno uznać za dobre, a do tej pory jedynym powodem ich użycia są klasy używane jako parametr konfiguracyjny (bardzo prosta klasa z wieloma polami i bez logiki, więc klasa jest przekazywana jako parametr sam do jakaś metoda).
Ale z drugiej strony prywatne pola obniżają elastyczność kodu dla innych użytkowników.
Elastyczność a problemy, zalety i wady:
Obiekty tworzone przez Twój kod w klasie waniliowej z polami chronionymi są bezpieczne i ponosisz wyłączną odpowiedzialność.
Z drugiej strony, obiekty rozszerzające twoją klasę o pola chronione, tworzone przez użytkowników twojego kodu, są ich odpowiedzialnością, a nie twoją.
Zatem słabo udokumentowane chronione pola / metody lub jeśli użytkownicy tak naprawdę nie rozumieją, jak takie pola i metody powinny być używane, mają duże szanse na spowodowanie niepotrzebnych problemów dla siebie i dla ciebie.
Z drugiej strony, uczynienie większości rzeczy prywatnymi obniży elastyczność użytkowników, a nawet może odłożyć ich na bok, szukając utrzymywanych alternatyw, ponieważ mogą nie chcieć tworzyć i utrzymywać rozwidlenia tylko po to, aby coś się stało po swojemu.
Tak więc naprawdę ważna jest równowaga między prywatnym, chronionym i publicznym.
Teraz wybór między prywatnym a chronionym jest prawdziwym problemem.
Kiedy używać chronionego?
Za każdym razem, gdy rozumiesz, że pole może być bardzo elastyczne, należy je zakodować jako chronione. Ta elastyczność to: od uzyskania wartości zerowej (gdzie wartość zerowa jest zawsze sprawdzana i uznawana za prawidłowy stan bez zgłaszania wyjątków), do posiadania ograniczeń przed użyciem przez klasę ex. > = 0, <100 itd. I automatycznie ustawiane na wartości przekroczone / niedopełnione, wyświetlając co najwyżej komunikat ostrzegawczy.
Tak więc dla takiego chronionego pola można utworzyć getter i używać go tylko (zamiast bezpośrednio używać zmiennej field), podczas gdy inni użytkownicy mogą jej nie używać, na wypadek, gdyby chcieli większej elastyczności w swoim specyficznym kodzie, w moim przykładzie może to być : jeśli chcą, aby wartości ujemne działały poprawnie w ich rozszerzonej klasie.