Czy Java ma modyfikator dostępu „chroniony prywatnie”?

160

Widziałem odniesienia do modyfikatora dostępu w Javie o nazwie private protected(oba słowa razem):

private protected someMethod() {

}

Jedna ze stron, które odnalazłem, jest tutaj . Moja lekcja szkolna również odnosiła się do tego modyfikatora dostępu (i powiedziała, że ​​istnieje). Użycie go powoduje jednak błąd w języku Java.

Próbowałem zarówno ze zmiennymi, jak i metodami i jestem prawie pewien, że nie istnieje, ale chcę wyjaśnić, co się stało. Czy został rozważony, a następnie odrzucony? A może został usunięty w nowszej wersji Java?

Edycja: nie szukam informacji o protectedsłowie kluczowym.


źródło
60
Znaleziona strona ustawia nagłówek HTTP „Last-Modified” w postaci: Mon, 26 lutego 1996 18:14:04 GMT!
G. Sylvie Davies
6
@Joe Jestem za wszystkimi pytaniami zamykającymi, podszywającymi się, jeśli to możliwe, ale nie widzę tam nic o połączonym private protectedmodyfikatorze.
jpmc26
2
@ jpmc26 Zobacz „W Javie 1.0 był dodatkowy modyfikator dostępu, chroniony prywatnie”. Jednak odpowiedź tutaj to znacznie lepsze podsumowanie historii.
Joe,
2
@Joe Rzeczywiście, private protectedw tej odpowiedzi jest odniesienie do , ale nie wyjaśnia, dlaczego ani co się z nią stało, czego dotyczy to pytanie.
m0skit0
3
Czy ktoś jeszcze uważa za przerażające, że OP uczył się tego w szkole… ponad 20 lat po usunięciu go z Dokumentów? Ciekawa lekcja historii, ale wciąż trochę przerażająca, że ​​ludzie uczą się czegoś, co zostało usunięte zanim Java 1 została nazwana ...
XaolingBao

Odpowiedzi:

191

Usunięcie modyfikatora dostępu

Java pierwotnie miała private protectedmodyfikator, ale został on usunięty w JDK 1.0.2 (pierwsza stabilna wersja, Java 1.0, którą znamy dzisiaj). Kilka samouczków dotyczących JDK 1.0.2 ( tutaj i tutaj ) mówi, co następuje:

Uwaga: Wersja 1.0 języka Java obsługiwała pięć poziomów dostępu: cztery wymienione powyżej plus private protected. Poziom private protecteddostępu nie jest obsługiwany w wersjach Java wyższych niż 1.0; nie powinieneś już używać go w swoich programach Java.

Inna odpowiedź na SoftwareEngineering.SE brzmi:

Java pierwotnie miała taki modyfikator. Został napisany, private protectedale usunięty w Javie 1.0.

Teraz spójrz na historię wersji Java :

JDK 1.0

Pierwsza wersja została wydana 23 stycznia 1996 roku i nosiła nazwę Oak. Pierwsza stabilna wersja, JDK 1.0.2, nosi nazwę Java 1.

Z tego możemy wywnioskować, że samouczki dotyczące wersji 1.0.2 odnoszą się do pierwszej wersji JDK 1.0, w której język nazywał się Oak, ale ten z SoftwareEngineering.SE odnosi się do pierwszej stabilnej wersji, JDK 1.0.2 zwanej Java 1.0, gdzie został usunięty.

Teraz, jeśli spróbujesz wyszukać go w dokumentacji Java 1.0 , nie znajdziesz go, ponieważ jak wspomniano wcześniej, został usunięty w JDK 1.0.2, znanym również jako Java 1.0. Jest to ponownie udowodnione, gdy spojrzysz na czasy ostatniej modyfikacji dla opublikowanego linku. Opublikowane łącze zostało ostatnio zmodyfikowane w lutym 1996 r. private protectedUsunięta Java 1.0 / JDK 1.0.2 została wydana po lutym 1996 r. , A zgodnie ze specyfikacją w sierpniu 1996 r.

Przyczyna usunięcia

Niektóre źródła wyjaśniają również powód private protected, na przykład ten . Cytować:

Co było chronione prywatnie?

Na początku język Java pozwalał na pewne kombinacje modyfikatorów, z których jednym był private protected. Chodziło o private protectedto, aby ograniczyć widoczność ściśle do podklas (i usunąć dostęp do pakietu). Zostało to później uznane za nieco niespójne i zbyt skomplikowane i nie jest już obsługiwane. [5]

[5] Znaczenie protectedmodyfikatora zmieniło się w wersji Beta2 Javy, a private protectedkombinacja pojawiła się w tym samym czasie. Poprawili kilka potencjalnych luk w zabezpieczeniach, ale zdezorientowali wielu ludzi.

SoftwareEngineering.SE również to wspiera, mówiąc, że nie było warte niespójności i dodatkowej złożoności, więc zostało wcześnie usunięte.

Interpretacja

Moja interpretacja tego wszystkiego jest taka, że ​​być może w czasach dębu obaj mogli współistnieć (stąd ta kombinacja). Ponieważ protectedznaczenie zmieniło się 1 , może zaistnieć potrzeba przyzwolenia privatei protectedw tym samym czasie. Wprowadzenie stało się zbyt skomplikowane i nie było tego warte, a zatem ostatecznie zostało porzucone. Zanim pojawiła się Java 1.0 / JDK 1.0.2, została usunięta i dlatego nie można jej znaleźć w dokumentacji.


1 W specyfikacji języka Oak , sekcja 4.10, Dostęp do zmiennych i metod , zauważono, że domyślnym modyfikatorem był protected:

Domyślnie wszystkie zmienne i metody w klasie są chronione .

To jest zupełnie inne niż to, co mamy dzisiaj, domyślny dostęp do pakietu. Mogło to utorować drogę potrzebom private protected, ponieważ privatebyło zbyt restrykcyjne i protectedzbyt łagodne.

Andrew Li
źródło
Jestem pewien, że nie jest to wiele warte - ale pamiętam, kiedy to się stało (programowałem jako dziecko iz jakiegoś powodu bardzo interesowałem się tą nową sprawą w Javie) i chociaż nie mogę znaleźć żadnego z oryginalnych źródeł - pamiętam rzeczy dokładnie tak, jak za nimi podążałem.
Benjamin Gruenbaum
Early on, the Java language allowed for certain combinations of modifiers, Czy to oznacza, że ​​było coś więcej niż tylko „Ochrona prywatna”?
XaolingBao
@XaolingBao Cóż, oczywiście, jeden akcesor jest jak żaden akcesor :) Podane linki powinny wyjaśnić twoje pytanie.
m0skit0
52

Istnieją mylące / niejasne historie:

Jedna, pochodząca ze źródła Princeton, a także z archiwów MIT , stwierdza, że:

Uwaga: Wersja 1.0 języka Java obsługiwała pięć poziomów dostępu: cztery wymienione powyżej plus ochrona prywatna. Poziom dostępu chronionego prywatnie nie jest obsługiwany w wersjach Java wyższych niż 1.0; nie powinieneś już używać go w swoich programach Java.

Ale ta funkcja nie jest określona w żadnej oficjalnej dokumentacji Java 1.0 tutaj ani tutaj .

Domyślam się, że ta funkcja nie dotarła do oficjalnej wersji 1.0, ponieważ oficjalna specyfikacja języka pochodzi z sierpnia 1996 roku, a źródło w Princeton zostało ostatnio zmodyfikowane w lutym 1996 roku .

PS: szkoda Oracle za usunięcie archiwów dla starszych wersji.

m0skit0
źródło
więc czy mój link jest starszą wersją tej samej treści? : D
Może brakujące informacje mają coś wspólnego z tą notatką, którą umieściłeś.
@AndrewLi Nigdzie nie jest określone jako stabilne w podanych odniesieniach. I zdecydowanie mylące jest nazywanie 1.0.2 jako 1.0, gdy istnieje rzeczywista wersja 1.0.
m0skit0
10

Jak sugeruje link, który podałeś w swoim pytaniu, private protectedzostał użyty w element/memberklasie, kiedy chcesz subclassmieć dostęp do elementu, ale ukryć go przed innymi klasami w jego package.

Javaw porównaniu do C++ma dodatkową koncepcję hermetyzacji elementów - i jest to pakiet . Trzeba też zrozumieć, co jest dostępne w obrębie lub poza pakietem w Javajeśli chodzi o tych dostępowych-specyfikatorami jak private, publici protected.

Zwróć uwagę, że wyjaśniłem, dlaczego został użyty. Oczywiście nie w aktualnej wersji

programmer_of_the_galaxies
źródło
Mój link służy do dostępu do metody. Brak dostępu dla członków.
1
@MarkYisri to samo można użyć również dla zmiennych składowych. Specyfikatory dostępu działają nie tylko na metodach, ale także na zmiennych składowych. Innymi słowy, specyfikatory dostępu są koncepcjami hermetyzacji i są niezależne od tego, czy zastosujesz je do metod składowych czy zmiennych składowych. to dotyczy prawie wszystkich języków obiektowych, w tym C ++ i java
programmer_of_the_galaxies
W porządku, ale samouczek (co ciekawe) nie wspomina o prywatnej ochronie zmiennych. Poczekaj i pozwól mi zobaczyć, czy jest strona ze zmiennymi ...
0

Nie, nie można używać zarówno razem. Twój tutorial jest dziwny. To, co masz, to tak zwany pakiet prywatny lub chroniony dostęp do pakietu w odniesieniach ot6. Jest to domyślny dostęp, który jest włączony, gdy żaden kwalifikator acc6 nie jest zapisany jawnie.privateprotected

AlexR
źródło
3
Wiedziałem, że nie możesz tego użyć. Chcę wiedzieć, co się z nim stało, co lepiej wyjaśniają inne odpowiedzi.
4
Cóż, link pochodzi z 1996 roku, więc biorąc pod uwagę, że rozwój Javy rozpoczął się około rok wcześniej, zawartość linku nie jest tak dziwna: D
Keiwan
6
Słuszna uwaga na temat daty każdego dokumentu. Odpowiedziałem na pytanie, gdy przyjeżdżał mój pociąg, i napisałem je telefonicznie, więc przepraszam, jeśli odpowiedź nie była wystarczająco wykolejona. Chciałem tylko pomóc ...
AlexR
6
@AlexR Twój błąd w pisowni wykoleił się w rzeczywistości jest kalamburem (pociągiem). Właśnie zauważyłem. : D
1
@MarkYisri, szczegółowe. Pisanie za pomocą telefonu nie jest najlepszym sposobem publikowania odpowiedzi w SO.
AlexR
-2

Zakres prywatny obejmuje istniejącą klasę. Gdzie Protected można uzyskać dostęp w ramach pakietu i klasy rozszerzony o klasy w innych pakietach.

Bezproblemowo, jeśli chcesz, aby zmienna / metody były dostępne poza pakietem, musisz zdefiniować jako chronione / publiczne, w przeciwnym razie prywatne lub inne specyfikatory dostępu.

Metody chronione są zwykle dostępne z zewnątrz pakietu oraz wewnątrz podklas, tj. Klasa musi rozszerzyć odpowiednią klasę, aby korzystać z chronionych zdefiniowanych metod.

Prywatne metody / zmienne mają zakres wewnątrz klasy i nie mogą być dostępne poza klasą.

Dlatego nie możesz jednocześnie zdefiniować funkcji Private Protected!

Tejas Gowda
źródło
To nie odpowiadało na pytanie. Zapytałem, dlaczego to nie działa. Inne odpowiedzi znacznie lepiej odpowiadają na pytanie.
Aby wyjaśnić dalej, wiem, że to już nie działa, ale inne odpowiedzi wyjaśniają, dlaczego i co wydarzyło się w przeszłości. Twój nie.