Warum ist das 'private static'-Feld in der Java 8-Schnittstelle nicht erlaubt?

8

Wenn ich versuche, den folgenden Code zu kompilieren

%Vor%

Ich bekomme einen Fehler

%Vor%

Wenn ich private modifier lösche, kompiliert Code, aber ich möchte nicht, dass andere Klassen aus dem Paket dieses Feld sehen.

Warum erlaubt Java mir das nicht, wenn es tatsächlich Sinn macht?

    
Kamil Jarosz 16.07.2015, 10:50
quelle

4 Antworten

11

In der Pre-Java-8-Sicht der Welt waren Schnittstellen rein für Schnittstellenverträge, und private Mitglieder existieren rein für die Implementierung, so dass diese Einschränkung völlig sinnvoll war.

In der Post-Java-8-Welt, in der Interfaces Verhalten (aber nicht State) tragen können, stellt sich die Frage, ob andere Features von Klassen auch auf Interfaces angewendet werden sollten. (Nur weil etwas "vernünftig" sein könnte, heißt das nicht, dass es unterstützt werden muss; es gibt oft mehr als einen vernünftigen Weg, die Welt zu konstruieren.)

In Java 9 werden private Methoden in Schnittstellen unterstützt.

    
Brian Goetz 18.07.2015, 13:46
quelle
7

Schnittstellen sind keine Klassen. Sie haben keinen privaten Staat. Selbst ein öffentlicher Logger in der Schnittstelle ist ein Design-Geruch und ein Missbrauch von Schnittstellen.

Der Anwendungsfall für statische Felder in Schnittstellen ist hauptsächlich für Kompilierzeitkonstanten, nicht für statusbehaftete Objekte.

    
Marko Topolnik 16.07.2015 10:51
quelle
2

Das Ziel der Schnittstelle ist es, etwas zu definieren, das von anderen Klassen implementiert wird. Ein privates Feld definiert nichts, da es außerhalb der Schnittstelle nicht sichtbar ist. Daher ergibt es in diesem Konstrukt keinen Sinn. Es kann ein paar Hacks sein, wie man es benutzt (vielleicht von inneren Klassen der Schnittstelle), aber würde sowieso nicht wie ein gutes Design aussehen.

Wenn Sie tatsächlich einen Teil der Funktionalität implementieren, verwenden Sie stattdessen die abstrakte Klasse.

    
h22 16.07.2015 11:02
quelle
1

Interface ist wie ein Blueprint jeder Klasse, in der Sie Ihre Mitglieder deklarieren. Jede Klasse, die diese Schnittstelle implementiert, ist für ihre Definition verantwortlich. Auf private Mitglieder kann nur von demselben Klassenmitglied zugegriffen werden, was in Bezug auf die Schnittstelle keinen Sinn ergibt. Auf geschützte Mitglieder kann von denselben Klassenmitgliedern und geerbten Klassenmitgliedern zugegriffen werden, aber im Falle einer Schnittstelle erweitern wir niemals eine Schnittstelle, wir implementieren sie. Daher kann jede Schnittstelle generell nur öffentliche Methoden enthalten,

    
Piyush Mittal 16.07.2015 11:04
quelle