Warum sollte man eine Java-Schnittstellenmethode als abstrakt deklarieren?

143

Ich habe heute die Refactoring-Funktion "Pull-Schnittstelle" von Eclipse verwendet, um eine Schnittstelle basierend auf einer vorhandenen Klasse zu erstellen. Das Dialogfeld bot an, alle neuen Methoden der neuen Schnittstelle als "abstrakte" Methoden zu erstellen.

Was wäre der Vorteil davon?

Ich dachte, dass die Tatsache, dass Sie Schnittstellenmethoden als abstrakt deklarieren durften, ein überflüssiges und harmloses Merkmal der Sprache ist, das nicht besonders gefördert wird.

Warum sollte Eclipse einen solchen Stil unterstützen oder warum sollte sich jemand freiwillig dafür entscheiden?

Klarstellung: Ich frage nicht, warum Schnittstellenmethoden abstrakt sind, das ist offensichtlich. Ich frage mich, warum man sie explizit als abstrakt markieren würde, da sie ohnehin abstrakt sind, wenn sie sich in einer Schnittstelle befinden.

Uri
quelle

Antworten:

146

Gemäß der Java-Sprachspezifikation ist das abstractSchlüsselwort für Schnittstellen veraltet und sollte nicht mehr verwendet werden. (Abschnitt 9.1.1.1)

Angesichts der Neigung von Java zur Abwärtskompatibilität bezweifle ich jedoch, dass es jemals einen Unterschied machen wird, ob das abstractSchlüsselwort vorhanden ist.

jdmichal
quelle
1
Das war mein Verständnis (obwohl ich mit dem spezifischen JLS-Abschnitt nicht vertraut war). Ich frage mich, warum Eclipse mir die Möglichkeit bietet, eine obselete Markierung zu erstellen ...
Uri
Hast mich. Jemand irgendwo muss entschieden haben, dass es ein wünschenswertes "Feature" ist, und es
einfügen
18
Obwohl dies die am besten bewertete Antwort ist, bezieht sie sich auf den falschen Abschnitt der Spezifikation. 9.1.1.1 beschreibt das abstractSchlüsselwort in der Deklaration der Schnittstelle selbst, nicht in ihren Mitgliedern. Die Antwort von @ Will unten ist korrekt und enthält auch gültige Linkquellen.
Shaggy Frog
39

"Der Vorteil davon" (Hinzufügen einer Zusammenfassung zur Deklaration von Schnittstellenmethoden) in Eclipse wäre ein altes Kompatibilitätsproblem mit dem JDT Eclipse-Compiler in JDK1.3

Seit 1.4 enthalten JDK-Bibliotheken keine abstrakten Standardmethoden mehr (für abstrakte Klassen, die Schnittstellen implementieren).
Dies täuscht die Eclipse 1.3-Compilerdiagnose, da ihre Implementierung von ihrer Existenz abhängt.
Beachten Sie, dass Javac 1.3 die Ausführung von 1.4-Bibliotheken insgesamt ablehnen würde (mit der Option -bootclasspath).

Da sich der Eclipse-Compiler wahrscheinlich in der 1.4-Konformitätsstufe befindet (siehe Workbench>Preferences>Java>Compiler>JDK Compliance) oder mindestens 1.3 Klassenbibliotheken verwendet, wenn der 1.3-Konformitätsmodus verwendet wird, ist in den meisten aktuellen Eclipse-Projekten das Vorhandensein von "abstrakt" nicht erforderlich.

VonC
quelle
3
Guter Fund. Es ist also eine Funktionalität, ein nicht mehr vorhandenes Problem im Eclipse-Compiler zu umgehen.
jdmichal
1
@jdmichal: genau, und es ist auch eine genauere Antwort auf Uris Frage.
VonC
39

Aus dem Java SE 7 JLS (Java Language Specification): "Es ist zulässig, aber aus Stilgründen wird davon abgeraten, den öffentlichen und / oder abstrakten Modifikator für eine in einer Schnittstelle deklarierte Methode redundant anzugeben."

Für Java SE 5.0 : "Aus Gründen der Kompatibilität mit älteren Versionen der Java-Plattform ist es zulässig, den abstrakten Modifikator für in Schnittstellen deklarierte Methoden redundant anzugeben."

Wille
quelle
9

Laut JLS sind Methoden in Schnittstellen standardmäßig abstrakt, sodass das Schlüsselwort redundant ist. Wenn ich das wüsste, würde ich es niemals verwenden, um "Präsentationsunordnung zu vermeiden".

Daniel Hiller
quelle
Dies sollte die richtige Antwort sein. Hier ist ein aktualisierter Link - siehe Abschnitt "Hinweis"
Mork
Das JLS sagt nicht, dass das Schlüsselwort für Methoden in Schnittstellen veraltet ist. Darin heißt es: "Es ist zulässig, aber aus Stilgründen wird davon abgeraten, den öffentlichen und / oder abstrakten Modifikator für eine in einer Schnittstelle deklarierte Methode redundant anzugeben." JLS # 9.4 .
Marquis von Lorne
@EJP Ich habe nicht gesagt, dass das JLS angegeben hat, dass das Schlüsselwort veraltet sein würde, dies war meine persönliche Meinung;) Übrigens stellen sie fest, dass dieses Schlüsselwort "redundant" ist, was nicht ganz das gleiche wie veraltet ist, da haben Sie natürlich Recht . Jetzt, da ich weiß, werde ich die Antwort bearbeiten, um dies zu klären.
Daniel Hiller