Obwohl der oft zitierte Grund darin besteht, dass "Schnittstellen öffentliche APIs definieren", halte ich dies für eine übermäßige Vereinfachung. (Und es "riecht" auch nach zirkulärer Logik.)
Es wäre nicht bedeutungslos, Schnittstellen mit einer Mischung aus Zugriffsmodifikatoren zu haben. zB teilweise öffentlich und teilweise auf andere Klassen im selben Paket wie die Schnittstelle beschränkt. In einigen Fällen könnte dies sogar sehr nützlich sein, IMO.
Tatsächlich denke ich, dass der Grund für die implizite Veröffentlichung von Mitgliedern einer Schnittstelle darin besteht, dass die Java-Sprache dadurch einfacher wird :
Implizit öffentliche Schnittstellenmitglieder sind für Programmierer einfacher zu handhaben. Wie oft haben Sie Code (Klassen) gesehen, in dem die Methodenzugriffsmodifikatoren scheinbar zufällig ausgewählt wurden? Viele "normale" Programmierer haben Schwierigkeiten zu verstehen, wie Java-Abstraktionsgrenzen am besten verwaltet werden können 1 . Das Hinzufügen von public / protected / package-private zu Schnittstellen macht es für sie noch schwieriger.
Implizit öffentliche Schnittstellenmitglieder vereinfachen die Sprachspezifikation ... und damit die Aufgabe für Java-Compiler-Autoren und die Leute, die die Reflection-APIs implementieren.
Die Denkweise, dass die "Schnittstellen öffentliche APIs definieren", ist wohl eine Konsequenz (oder ein Merkmal) der vereinfachenden Entscheidung für das Sprachdesign ... nicht umgekehrt. In Wirklichkeit haben sich die beiden Gedankengänge in den Köpfen der Java-Designer wahrscheinlich parallel entwickelt.
In jedem Fall macht die offizielle Antwort auf die RFE in JDK-8179193 deutlich, dass das Java-Designteam entschieden hat 2 , dass das Zulassen protected
von Schnittstellen die Komplexität erhöht und nur wenig wirklichen Nutzen bringt. Ein großes Lob an @skomisa für die Suche nach Beweisen .
Die Beweise in der RFE lösen das Problem. Das ist der offizielle Grund, warum das nicht hinzugefügt wurde.
1 - Natürlich haben Top-Gun-Programmierer keine Schwierigkeiten mit diesen Dingen und begrüßen möglicherweise eine umfangreichere Palette von Zugriffssteuerungsfunktionen. Aber was passiert, wenn der Code zur Pflege an eine andere Person übergeben wird?
2 - Sie können mit ihrer Entscheidung oder ihrer Begründung nicht einverstanden sein, aber das ist strittig.