Jest dość nowy w Javie, ale zastanawiam się, dlaczego dostęp do pakietu jest uważany za "bardziej restrykcyjny" niż dostęp do podklasy. Oznacza to, że każdy modyfikator dostępu, który zapewnia podklasom dostęp do elementu, zapewnia także cały pakiet z dostępem i istnieją modyfikatory, które zapewniają dostęp do pakietu, ale nie podklasy.Java: Dostęp do podklasy bez dostępu do pakietów
Czy to nie jest całkowicie wstecz? Powiedzmy, że mam klasę ControlledInstantiation w jakiejś paczce. Jeśli mam inną klasę, funkcja ControlControlledInstantiation rozszerza ControlledInstantiation, nie mogę wywołać konstruktora ControlledInstantiation, chyba że ustawię go jako chroniony lub publiczny. I jeśli ustawię go na chroniony, teraz każda inna klasa w pakiecie może utworzyć go tak często, jak mu się podoba. Zatem coś, co jest obowiązkowe, aby mogło być substytutem swojej nadklasy (i syntaktycznie jest), uzyskuje taki sam lub mniejszy dostęp do nadklasy niż coś, co służy odrębnej, ale pokrewnej funkcji. To tak, jakby powiedzieć dziecku, że nie może bawić się portfelem, ponieważ nie pozwoliłbyś, aby twoi sąsiedzi to zrobili, a potem pozwolili twoim sąsiadom spać w twoim domu, ponieważ twoje dziecko to robi.
Sądzę, że pytam, co uzasadniało tę decyzję i jak mogę ją obejść?
ale piszesz kod "ControlledInstantiation", a zatem prawdopodobnie jesteś właścicielem kodu w jego pakiecie .. czy mówisz, że nie ufasz sobie? – pstanton
Każdy może utworzyć nową klasę w dowolnym pakiecie, z wyjątkiem tych, które chroni program ładujący klasy. O ile nie ukryję nazwy pakietu używanej przeze mnie klasy we wszystkich udokumentowanych interfejsach (co, jak sądzę, jest niemożliwe, ponieważ nawet fabryka musi zaimportować klasę, którą tworzy, iw pewnym momencie musi się odwoływać do samej fabryki itp. .), każdy może umieścić klasę w tym pakiecie. Ludzie prawie na pewno by tego nie zrobili, chyba że chcieli zrobić coś, czego nie powinni, ale mogli. – Innominate