Was ist der Unterschied zwischen interface und @interface in Java?

306

Ich habe Java seit der Verwendung von JBuilder in den späten 90ern während meines Studiums nicht mehr berührt, daher bin ich ein wenig 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.

Ich stelle fest, dass es das Hinzufügen von Schnittstellen und @ Schnittstellen unterstützt. 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.

Bittercoder
quelle

Antworten:

322

Das @ -Symbol kennzeichnet eine Definition des Annotationstyps.

Das heißt, es ist nicht wirklich um eine Schnittstelle, sondern um einen neuen Annotationstyp, der als Funktionsmodifikator wie @override verwendet werden kann .

Siehe diesen Javadocs-Eintrag zu diesem Thema.

mrkishi
quelle
7
Vielen Dank, gut zu wissen. Also, was war der Grund dafür, es @interface zu nennen, anstatt @annotation zu sagen, frage ich mich .. scheint ein unnötig überladener Begriff zu sein.
Bittercoder
5
Das Tutorial und das JLS verweisen darauf, dass eine Anmerkung eine besondere Art von Schnittstelle darstellt. Es scheint nicht viel Diskussion zu diesem Thema zu geben, aber javarunner.blogspot.com/2005/01/annotations-in-java-15.html erklärt, dass Annotationen eine implizite Erweiterung der Annotation-Schnittstelle und der @ und -Schnittstelle sind werden verwendet, um gemeinsam von einer regulären Schnittstelle zu unterscheiden. Möglicherweise möchten Sie auch die JSR-Spezifikation für Anmerkungen lesen.
DavidValeri
1
@Bittercoder In den Dokumenten wird Folgendes erwähnt: "Vor der Schlüsselwortschnittstelle steht das at-Zeichen (@) (@ = AT, wie im Anmerkungstyp)." Das ist die ganze Begründung, die ich für die Benennung finden kann.
Shaishav
112

Schnittstelle:

Im Allgemeinen macht eine Schnittstelle einen Vertrag verfügbar, ohne die zugrunde liegenden Implementierungsdetails offenzulegen. In der objektorientierten Programmierung definieren Schnittstellen abstrakte Typen, die das 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 Anmerkungstyp 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 kommentieren 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.

Referenz: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

Mavis
quelle
11
nette Erklärung
Pat B
2
Das war eigentlich nützlich. Ich wusste nicht, dass Java das kann.
Jay Sidri
Die vorherige Antwort enthielt diesen Link, von dem diese Informationen stammen. Ich fand es nützlich, weitere Informationen zu diesem Thema zu finden. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Eine der besten und vollständigsten Antworten (noch klar), die ich beim Stackoverflow gesehen habe.
Herr D
32

Das interfaceSchlüsselwort gibt an, dass Sie eine traditionelle Schnittstellenklasse in Java deklarieren.
Das @interfaceSchlüsselwort wird verwendet, um einen neuen Anmerkungstyp zu deklarieren.

Eine Beschreibung der Syntax finden Sie im docs.oracle-Tutorial zu Anmerkungen.
Sehen Sie sich das JLS an, wenn Sie wirklich näher auf die Bedeutung eingehen möchten @interface.

DavidValeri
quelle
18

interface: definiert den Vertrag für eine Klasse, die ihn implementiert

@interface: definiert den Vertrag für eine Anmerkung

Emmanuel Osimosu
quelle
8

Schnittstelle in der Programmiersprache Java ist ein abstrakter Typ, mit dem ein Verhalten angegeben wird, das Klassen implementieren müssen. Sie ähneln Protokollen. Schnittstellen werden mit dem Schlüsselwort interface deklariert

@interface wird verwendet, um eigene (benutzerdefinierte) Java-Annotationen zu erstellen. Anmerkungen werden wie eine Java-Klasse oder -Schnittstelle in einer eigenen Datei definiert. Hier ist ein Beispiel für eine benutzerdefinierte Java-Annotation:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

In diesem Beispiel wird eine Anmerkung namens MyAnnotation definiert, die vier Elemente enthält. Beachten Sie das Schlüsselwort @interface. Dies signalisiert dem Java-Compiler, dass dies eine Java-Annotationsdefinition ist.

Beachten Sie, dass jedes Element ähnlich wie eine Methodendefinition in einer Schnittstelle definiert ist. Es hat einen Datentyp und einen Namen. Sie können alle primitiven Datentypen als Elementdatentypen verwenden. Sie können auch Arrays als Datentyp verwenden. Sie können keine komplexen Objekte als Datentyp verwenden.

Um die obige Anmerkung zu verwenden, können Sie folgenden Code verwenden:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

Referenz - http://tutorials.jenkov.com/java/annotations.html

Piyush Singh
quelle