Was ist der Unterschied zwischen Interface und @interface in Java?
Lesezeit: 6 Minuten
Bittercoder
Ich habe Java nicht mehr berührt, seit ich Ende der 90er Jahre an der Universität JBuilder verwendet habe, also bin ich etwas außer Kontakt – jedenfalls habe ich diese Woche an einem kleinen Java-Projekt gearbeitet und Intellij IDEA als meine IDE verwendet , für eine Abwechslung von meiner regulären .Net-Entwicklung.
Mir ist aufgefallen, dass das Hinzufügen von Schnittstellen und @Schnittstellen unterstützt wird. Was ist eine @Schnittstelle und wie unterscheidet sie sich von einer normalen Schnittstelle?
public interface Test {
}
vs.
public @interface Test {
}
Ich habe ein bisschen gesucht, konnte aber nicht viele nützliche Informationen finden, die sich auf @interface beziehen.
Das @ Symbol bezeichnet eine Anmerkungstypdefinition.
Das heißt, es ist nicht wirklich eine Schnittstelle, sondern eher ein neuer Anmerkungstyp – der als Funktionsmodifikator verwendet werden soll, wie z @überschreiben.
Super danke, gut zu wissen. Was war also der Grund dafür, es @interface zu nennen, anstatt @annotation zu sagen, frage ich mich … scheint ein unnötig überladener Begriff zu sein.
– Bittercoder
27. Mai 2009 um 23:46 Uhr
Das Tutorial und das JLS spielen auf eine Annotation als spezielle Art von Schnittstelle an. Es scheint nicht viel Diskussion über das Thema zu geben, aber javarunner.blogspot.com/2005/01/annotations-in-java-15.html erklärt, dass Annotationen eine implizite Erweiterung der Annotation-Schnittstelle sind und @ und interface zusammen verwendet werden, um sich von einer regulären Schnittstelle zu unterscheiden. Möglicherweise möchten Sie auch die JSR-Spezifikation für Anmerkungen lesen.
– DavidValeri
28. Mai 2009 um 11:41 Uhr
@Bittercoder die Dokumentation erwähnt: “dem Schlüsselwort interface wird das at-Zeichen (@) (@ = AT, wie im Annotationstyp) vorangestellt”. Das ist die Begründung, die ich bezüglich der Benennung finden kann.
– Shaishav
6. September 2017 um 3:41 Uhr
Eigentlich ist Bittercoders Frage ziemlich unvermeidlich, und DavidValeris Link erklärt es sehr schön. Du kannst also so schreiben: @ interfacenicht nur @interface.
– Sternchen
11. Dezember 2020 um 3:27 Uhr
mavis
Schnittstelle:
Im Allgemeinen legt eine Schnittstelle einen Vertrag offen, ohne die zugrunde liegenden Implementierungsdetails offenzulegen. In der objektorientierten Programmierung definieren Schnittstellen abstrakte Typen, die Verhalten offenlegen, aber keine Logik enthalten. Die Implementierung wird durch die Klasse oder den Typ definiert, der die Schnittstelle implementiert.
@interface : (Anmerkungstyp)
Nehmen Sie das folgende Beispiel, das viele Kommentare enthält:
public class Generation3List extends Generation2List {
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
// class code goes here
}
Stattdessen können Sie einen Annotationstyp deklarieren
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
String[] reviewers();
}
die dann eine Klasse wie folgt annotieren kann:
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
// Note array notation
reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {
// class code goes here
}
PS: Viele Anmerkungen ersetzen Kommentare im Code.
Ich bin mir nicht sicher, warum jeder diese Antwort liebt, obwohl sie einen sehr begrenzten Anwendungsfall für die Anmerkungen bietet. Anmerkungen in Java werden für so viel mehr Dinge verwendet als nur als Ersatz für Kommentare. Die Stärke von Anmerkungen liegt in der Tatsache, dass sie die Art und Weise ändern können, wie sich annotierte Elemente verhalten oder in der Laufzeit verarbeitet werden
– Leonid Usov
20. August 2020 um 15:33 Uhr
DavidValeri
Das interface Schlüsselwort gibt an, dass Sie eine traditionelle Schnittstellenklasse in Java deklarieren.
Das @interface Schlüsselwort wird verwendet, um einen neuen Anmerkungstyp zu deklarieren.
Sehen docs.oracle-Tutorial auf Anmerkungen für eine Beschreibung der Syntax.
Siehe die JLS wenn Sie wirklich ins Detail gehen wollen, wovon @interface meint.
Emmanuel Osimosus
interface: definiert den Vertrag für eine Klasse, die ihn implementiert
@interface: definiert den Vertrag für eine Anmerkung
Schnittstelle
in der Programmiersprache Java ist ein abstrakter Typ, der verwendet wird, um ein Verhalten anzugeben, das Klassen implementieren müssen. Sie ähneln Protokollen. Schnittstellen werden mit dem Schlüsselwort interface deklariert
@Schnittstelle
wird verwendet, um Ihre eigenen (benutzerdefinierten) Java-Anmerkungen zu erstellen. Anmerkungen werden in einer eigenen Datei definiert, genau wie eine Java-Klasse oder -Schnittstelle. Hier ist ein Beispiel für eine benutzerdefinierte Java-Anmerkung:
Dieses Beispiel definiert eine Anmerkung namens MyAnnotation, die vier Elemente hat. Beachten Sie das Schlüsselwort @interface. Dies signalisiert dem Java-Compiler, dass es sich um eine Java-Annotationsdefinition handelt.
Beachten Sie, dass jedes Element ähnlich wie eine Methodendefinition in einer Schnittstelle definiert wird. Es hat einen Datentyp und einen Namen. Als Elementdatentypen können Sie alle primitiven Datentypen verwenden. Sie können auch Arrays als Datentyp verwenden. Als Datentyp können Sie keine komplexen Objekte verwenden.
Um die obige Anmerkung zu verwenden, könnten Sie Code wie diesen verwenden:
@MyAnnotation(
value="123",
name="Jakob",
age=37,
newNames={"Jenkov", "Peterson"}
)
public class MyClass {
}
Mit @interface definieren Sie Annotationen, mit interface definieren Sie Schnittstellen.
Aus Oracle-Dokumenten: „Anmerkungen wirken sich nicht direkt auf die Programmsemantik aus, aber sie beeinflussen die Art und Weise, wie Programme von Tools und Bibliotheken behandelt werden, was wiederum die Semantik des laufenden Programms beeinflussen kann. Anmerkungen können aus Quelldateien, Klassendateien, oder reflektierend zur Laufzeit.”
Anmerkungen haben normalerweise zwei Hauptverwendungen: Sie helfen, Programmierverträge zu definieren (wie die @Nonnull-Annotation), was bedeutet, dass sie eigentlich nichts tun, sondern Programmierern und IDES dienen, um potenzielle Fehlercodes zu erkennen, und es gibt Laufzeitannotationen, die normalerweise von verwendet werden Frameworks für die Konfiguration (wie die @Service-Annotation im Frühjahr): Der Kern erkennt Klassen in Ihrem Bereich mit spezifischen Annotationen und wendet Logik auf sie an (jedes Beispiel, das Sie sich vorstellen können, wie das Definieren von Java-Servern, das Erstellen von Singletons usw.)
Im Allgemeinen wird ein Junior-Programmierer, der einige normale grundlegende Dinge macht, selten Anmerkungen definieren müssen, aber die Definition und Verwendung von Schnittstellen ist etwas Grundlegendes, das jeder neue Entwickler lernen sollte, wenn seine Sprache es zulässt: Gute Praktiken empfehlen normalerweise die Verwendung von Schnittstellen in Ihrem Code für Wartbarkeit.
Nach meiner persönlichen Erfahrung habe ich fast seit dem Tag, an dem ich Java gelernt habe, Java-Schnittstellen definiert und verwendet, aber ich musste keine Anmerkung DEFINIEREN (Dinge mit vorhandenen Anmerkungen zu markieren, ist eine andere Geschichte), bis ich im 5.-6. Jahr beruflich arbeitete mit Java, und es war ein sehr spezifisches Projekt, ein Code-Autogenerator, so etwas wie Lombok, aber viel spezifischer für einen Kunden.
Ich denke, es hängt von der Art Ihrer Arbeit ab, aber heute kann ich nicht zählen, wie viele Schnittstellen ich definiert habe, aber Anmerkungen könnten mit den Fingern beider Hände gezählt werden. Ich wette, es gibt gute Chancen, dass ein Java-Entwickler seine gesamte Karriere beginnen und beenden kann, ohne eine einzige Schnittstelle zu definieren (es sei denn, Sie verwenden Swaggers annotationsbasierte Dokumentationsgenerierung xD).
13603700cookie-checkWas ist der Unterschied zwischen Interface und @interface in Java?yes