Chociaż często przytaczanym powodem jest to, że „interfejsy definiują publiczne API”, myślę, że jest to nadmierne uproszczenie. (I "pachnie" też logiką kolistą.)
Nie byłoby bez sensu posiadanie interfejsów zawierających mieszankę modyfikatorów dostępu; np. częściowo publiczne, a częściowo ograniczone do innych klas w tym samym pakiecie co interfejs. W rzeczywistości w niektórych przypadkach może to być przydatne w dół, IMO.
Właściwie uważam, że częścią rozumowania stojącego za upublicznieniem elementów interfejsu jest to, że upraszcza to język Java :
Niejawnie publiczne elementy składowe interfejsu są prostsze w obsłudze dla programistów. Ile razy widziałeś kod (klasy), w którym modyfikatory dostępu do metody były wybierane pozornie losowo? Wielu „zwykłych” programistów ma trudności ze zrozumieniem, jak najlepiej zarządzać granicami abstrakcji Javy 1 . Dodanie publicznego / chronionego / prywatnego pakietu do interfejsów sprawia, że jest to jeszcze trudniejsze.
Niejawnie publiczne elementy interfejsu upraszczają specyfikację języka ... a tym samym zadanie dla autorów kompilatorów Java i osób, które implementują interfejsy API Reflection.
Myślenie, że „interfejsy definiują publiczne API” jest prawdopodobnie konsekwencją (lub cechą) decyzji dotyczącej projektu uproszczenia języka ... a nie na odwrót. Ale w rzeczywistości te dwa nurty myślenia prawdopodobnie rozwinęły się równolegle w umysłach projektantów Javy.
W każdym razie oficjalna odpowiedź na RFE w JDK-8179193 jasno pokazuje, że zespół projektowy Java zdecydował 2, że dopuszczenie protectedinterfejsów zwiększa złożoność i przynosi niewielkie realne korzyści. Uznanie dla @skomisa za znalezienie dowodów .
Dowody w RFE rozwiązują problem. To jest oficjalny powód, dla którego nie został dodany.
1 - Oczywiście programiści z najwyższej półki nie mają z tym trudności i mogą z zadowoleniem przyjąć bogatszą paletę funkcji kontroli dostępu. Ale co się stanie, gdy ich kod zostanie przekazany komuś innemu w celu utrzymania?
2 - Możesz nie zgadzać się z ich decyzją lub uzasadnieniem, ale to kwestia dyskusyjna.