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

Lesezeit: 6 Minuten

Benutzer-Avatar
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.

Sieh dir das an javadocs-Eintrag zum Thema.

  • 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

Benutzer-Avatar
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.

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

  • Das war tatsächlich nützlich. Ich wusste nicht, dass Java das kann.

    – Jay Sidri

    29. August 2016 um 5:53 Uhr

  • Die vorherige Antwort enthielt diesen Link, von dem diese Informationen stammten. Ich fand es hilfreich, mehr Informationen zu diesem Thema zu finden. docs.oracle.com/javase/tutorial/java/annotations/declaring.html

    – PatS

    11. November 2018 um 1:50 Uhr


  • 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

Benutzer-Avatar
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.

Benutzer-Avatar
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:

@interface MyAnnotation {

    String   value();

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

}

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 {


}

Bezug – http://tutorials.jenkov.com/java/annotations.html

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).

1360370cookie-checkWas ist der Unterschied zwischen Interface und @interface in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy