(Zastrzeżenie: Nie jestem programistą Java, jestem programistą Perla. Perl nie ma formalnej ochrony, co może dlatego tak dobrze rozumiem problem :))
Prywatny
Jak mogłoby się wydawać, tylko klasa, w której jest zadeklarowana, może to zobaczyć.
Pakiet prywatny
Można go zobaczyć i wykorzystać tylko w pakiecie, w którym został zadeklarowany. Jest to ustawienie domyślne w Javie (które niektórzy uważają za błąd).
Chroniony
Pakiet Private + może być widoczny dla podklas lub członków pakietu.
Publiczny
Każdy to widzi.
Widoczny poza kodem, który kontroluję. (Chociaż nie jest to składnia Java, jest to ważne w tej dyskusji).
C ++ definiuje dodatkowy poziom zwany „przyjacielem”, a im mniej o nim wiesz, tym lepiej.
Kiedy należy użyć Cały pomysł polega na enkapsulacji w celu ukrycia informacji. Na tyle, na ile to możliwe, chcesz ukryć szczegóły tego, jak coś się robi przed użytkownikami. Dlaczego? Ponieważ możesz je później zmienić i nie łamać niczyich kodów. Pozwala to optymalizować, refaktoryzować, przeprojektowywać i naprawiać błędy bez obawy, że ktoś używał właśnie zmodyfikowanego kodu.
Zatem podstawową zasadą jest, aby rzeczy były tak widoczne, jak powinny. Zacznij od prywatnego i dodaj więcej widoczności w razie potrzeby. Podaj do wiadomości publicznej tylko to, co jest absolutnie konieczne, aby użytkownik wiedział, każdy upubliczniony szczegół ogranicza twoją zdolność do przeprojektowania systemu.
Jeśli chcesz, aby użytkownicy mogli dostosowywać zachowania, zamiast upubliczniać elementy wewnętrzne, aby mogli je zastąpić, często lepszym pomysłem jest umieszczenie tych wnętrzności w obiekcie i upublicznienie tego interfejsu. W ten sposób mogą po prostu podłączyć nowy obiekt. Na przykład, jeśli piszesz odtwarzacz CD i chcesz dostosować bit „idź znaleźć informacje o tym dysku CD”, zamiast upubliczniać te metody, umieść całą tę funkcjonalność w swoim obiekcie i upublicznij tylko getter / setter obiektu . W ten sposób skąpstwo w ujawnianiu wnętrzności zachęca do dobrego składu i rozdzielenia obaw
Osobiście trzymam się tylko „prywatnego” i „publicznego”. Wiele języków OO właśnie to ma. „Chroniony” może być przydatny, ale to naprawdę oszustwo. Gdy interfejs jest bardziej niż prywatny, jest poza twoją kontrolą i musisz szukać kodu innej osoby, aby znaleźć zastosowania.
Właśnie tutaj pojawia się idea „opublikowania”. Zmiana interfejsu (refaktoryzacja) wymaga znalezienia całego kodu, który go używa, i zmiany również. Jeśli interfejs jest prywatny, nie ma problemu. Jeśli jest chroniony, musisz znaleźć wszystkie swoje podklasy. Jeśli jest publiczny, musisz znaleźć cały kod, który używa twojego kodu. Czasami jest to możliwe, na przykład, jeśli pracujesz nad kodem firmowym, który jest tylko do użytku wewnętrznego, nie ma znaczenia, czy interfejs jest publiczny. Możesz pobrać cały kod z repozytorium korporacyjnego. Ale jeśli interfejs zostanie „opublikowany”, jeśli kod korzysta z niego poza twoją kontrolą, oznacza to, że nie masz pewności. Musisz obsługiwać ten interfejs lub ryzykować łamanie kodu. Nawet chronione interfejsy można uznać za opublikowane (dlatego nie „
Wiele języków uważa, że hierarchiczny charakter publicznego / chronionego / prywatnego jest zbyt ograniczający i niezgodny z rzeczywistością. W tym celu istnieje koncepcja klasy cech , ale to kolejny program.
private
ukrywa się przed innymi klasami w pakiecie.public
naraża na klasy poza pakietem.protected
jest wersjąpublic
ograniczoną tylko do podklas.