Warum gibt es keine endgültigen Schnittstellen in Java?

7

Durch das Erweitern einer Schnittstelle werden einfach zusätzliche Operationen hinzugefügt, die in beliebigen Implementoren definiert werden müssen, und bestehende Implementierungen können nicht getrennt werden (im Gegensatz zum Erweitern einer Klasse). Aber es kann ändern ( EDIT 3 WAS KONSTANTEN) und daher den PERCIEVED-Wert von Konstanten ( EDIT 2 SO GESEHEN DURCH DIE UMSETZUNGSKLASSEN)

Zum Beispiel das Folgende:

%Vor%

ergibt 7, wenn vielleicht die Absicht der Schnittstelle A war, dass jede Implementierung von A ein test -Feld enthält, das mit 6 bewertet wird.

Wenn A als final deklariert würde, könnten wir sicher sein, dass alle Implementierungen von A den gleichen Wert von test sehen.

Also versteht irgendjemand, warum das nicht möglich ist?

  • S.S .: Dies ist NICHT ein Duplikat von diese Frage , ich kenne sie kann nicht endgültig sein, ich interessiere mich für das Denken hinter dem Design Entscheidung, die zu diesem Ergebnis geführt hat.

  • P.P.S .: Ich verstehe Konstanten in Schnittstellen ist in der Regel eine schlechte Idee, Das ist nicht das Problem hier.

BEARBEITEN: Überprüfen Sie den Überarbeitungsverlauf. Der Titel dieser Frage wurde so bearbeitet, dass die Frage nicht in der Absicht enthalten war. Entschuldigung an alle, die die Frage beantwortet haben, die ich nicht gestellt habe. Ja, Schnittstellenfelder sind implizit öffentlich statisch, das interessiert mich leider überhaupt nicht.

EDIT 2 Um ganz klar zu sein: Diese Frage betrifft, warum eine Schnittstelle andere Interfaces nicht davon abhalten kann, sie zu erweitern (indem sie final oder ein Äquivalent ist).

    
Tom Tresansky 08.10.2010, 19:48
quelle

6 Antworten

5

Der Hauptzweck der Schnittstelle ist nicht ein Container von Konstanten, sondern einige APIs, die von konkreten Klassen implementiert werden.

Und aus einer lang-Spezifikation ( 9.4. Abstract method declarations ):

  

Beachten Sie, dass eine in einer Schnittstelle deklarierte Methode nicht als final deklariert werden darf oder dass ein Fehler bei der Kompilierung auftritt. Eine in einer Schnittstelle deklarierte Methode kann jedoch von einer Methode implementiert werden, die in einer Klasse als final deklariert ist, die die Schnittstelle implementiert.

    
Victor Sorokin 08.10.2010, 19:55
quelle
11

Es ist endgültig. Tatsächlich ist es public static final , selbst wenn Sie diese nicht deklarieren. Was Sie tun, überschreibt nicht die konstante Variable; Sie verstecken die Version der übergeordneten Schnittstelle.

Überprüfen Sie es, das A.TEST wird nicht überschrieben. Es ist immer noch 6.

System.out.println (A.TEST);

    
jbindel 08.10.2010 20:03
quelle
3

Wie ich es verstehe, sollen Interfaces keine Einschränkungen für Implementierungen darstellen. Sie sollen Vertrag (API) definieren.
Ab diesem Zeitpunkt sind sowohl die Methode doIt als auch die Konstante TEST Elemente der API. Wir wissen, wie man sie benutzt, aber wir wissen nicht, was drin ist.
Und wie genau die Methode doIt in InterfacesTest implementiert ist oder welche genaue Wertkonstante TEST hat - Implementierungsdetails.

    
Nikita Rybak 08.10.2010 19:54
quelle
2

Sie haben zwei Variablen namens TEST, nicht eine. Es findet kein Außerkraftsetzen statt. Überschreiben ist nur für Methoden.

    
Ricky Clarkson 08.10.2010 21:14
quelle
1

final Methoden können nicht überschrieben werden.

final verhindert, dass ein Feld geändert wird, verhindert aber nicht, dass es ausgeblendet wird. Hinweis: Sie können ein Feld nicht überschreiben.

In Ihrem Fall wird A.TEST jedoch von B.TEST ausgeblendet

%Vor%

würde drucken

%Vor%     
Peter Lawrey 08.10.2010 22:47
quelle
0

If A were to be declared final we could be assured all implementations of A see the same value of test.

Vielleicht haben Sie diese Frage selbst beantwortet.

Sie können auch keine endgültige abstrakte Klasse erstellen, denn um Sinn zu haben, muss sie implementiert werden, dasselbe gilt für die Schnittstelle, die von einer Klasse implementiert werden muss.

    
quelle

Tags und Links