2009-03-13 12 views
133

Ich habe die "Pull-Schnittstelle" Refactoring-Funktion von Eclipse heute 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.Warum sollte man eine Java-Interface-Methode als abstrakt deklarieren?

Was wäre der Vorteil davon?

Ich dachte, dass die Tatsache, dass Sie Interfacemethoden als abstrakt deklarieren konnten, eine überflüssige und harmlose Eigenschaft der Sprache war, die 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 sich explizit dafür entscheidet, sie als abstrakt zu bezeichnen, denn wenn sie in einer Schnittstelle sind, sind sie sowieso abstrakt.

Antwort

140

Laut der Java Language Specification ist das Schlüsselwort abstract für Schnittstellen veraltet und sollte nicht mehr verwendet werden. (Abschnitt 9.1.1.1)

Das heißt, mit Javas Neigung zur Abwärtskompatibilität bezweifle ich wirklich, dass es jemals einen Unterschied machen wird, ob das Schlüsselwort abstract vorhanden ist.

+1

Das war mein Verständnis (obwohl ich nicht mit dem spezifischen JLS Abschnitt vertraut war). Ich frage mich, warum Eclipse mir die Möglichkeit bieten würde, eine Obselete-Markierung zu erstellen ... – Uri

+0

Got me. Irgendjemand irgendwo muss entschieden haben, dass es ein wünschenswertes "Feature" war, und es hineinlegen. Weißt du, einer dieser schlauen Open-Source-Typen :) – jdmichal

+2

tsk tsk ... Ohne eine Warnung, dass es obselete ... – Uri

9

Laut JLS Methoden in Schnittstellen sind standardmäßig abstrakt, so dass das Schlüsselwort redundant ist. Wenn ich das wüsste, würde ich es nie benutzen, um "Präsentations-Chaos" zu vermeiden.

+0

Dies sollte die richtige Antwort sein. Hier ist eine aktualisierte [link] (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) - siehe "Hinweis" Abschnitt – mork

+0

Die JLS sagt nicht, dass das Schlüsselwort für Methoden in Schnittstellen veraltet ist. Es heißt: "Es ist zulässig, aber aus Stilgründen nicht erlaubt, den öffentlichen und/oder abstrakten Modifizierer für eine in einer Schnittstelle deklarierte Methode redundant anzugeben." [JLS # 9.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4). – EJP

+0

@EJP Ich habe nicht gesagt, dass die JLS angegeben, dass das Keyword veraltet wäre, das war meine persönliche Meinung;) Übrigens bemerken sie, dass dieses Keyword "redundant" ist, was nicht ganz dasselbe ist wie veraltet, in dem du recht hast Kurs. Jetzt, da ich weiß, werde ich die Antwort bearbeiten, um dies zu klären. – dhiller

38

„Die Pfründe, dass“ (Hinzufügen abstrakt auf Interface-Methoden Deklaration) in Eclipse würde mit jdt eclipse compiler in jdk1.3

Seit 1.4, JDK-Bibliotheken sind nicht mehr enthielten Standard-abstrakte Methoden (auf abstrakte Klassen ein altes Kompatibilitätsproblem sein Implementieren von Schnittstellen).
Das täuscht die Eclipse 1.3-Compilerdiagnose, da ihre Implementierung auf ihrer Existenz beruht.
Beachten Sie, dass Javac 1.3 die Ausführung von 1.4 Bibliotheken (mit der Option -bootclasspath) ablehnen würde.

Da der Eclipse-Compiler ist wahrscheinlich in 1.4 Compliance-Niveau sein (siehe Workbench>Preferences>Java>Compiler>JDK Compliance) oder mindestens 1,3 Klassenbibliotheken verwenden, wenn 1.3 Compliance-Modus, das Vorhandensein von „abstrakt“ ist nicht erforderlich, in den meisten der aktuellen Eclipse-Projekte.

+3

Gut finden. Es ist also Funktionalität, um ein nicht mehr existierendes Problem im Eclipse-Compiler zu umgehen. – jdmichal

+1

@jdmichal: genau, und es ist auch eine genauere Antwort auf Uris Frage. – VonC

34

Aus der Java SE 7 JLS (Java Language Specification): "Es ist erlaubt, aber aus stilistischen Gründen 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 erlaubt, aber aus Stilgründen überflüssig, den abstrakten Modifizierer für in Schnittstellen deklarierte Methoden anzugeben."

Verwandte Themen