2009-05-27 5 views
187

Ich habe Java seit der Verwendung von JBuilder in den späten 90ern während der Universität nicht mehr angefasst, also bin ich ein wenig außer Reichweite - jedenfalls habe ich diese Woche an einem kleinen Java-Projekt gearbeitet und Intellij IDEA als meine IDE, für eine Änderung der Geschwindigkeit von meiner regulären .Net-Entwicklung.Was ist der Unterschied zwischen Interface und @interface in Java?

Ich bemerke, dass es Unterstützung für das Hinzufügen von Schnittstellen und @ Interfaces bietet, was ist ein @ Interface und wie unterscheidet es sich von einer normalen Schnittstelle?

public interface Test { 
} 

gegen

public @interface Test { 
} 

ich ein bisschen suchen getan haben, konnte aber nicht viel nützliche Informationen mit Bezug auf @interface finden.

Antwort

198

Das Symbol @ symbolisiert eine Annotation-Typ-Definition.

, dass es bedeutet ist nicht wirklich eine Schnittstelle, sondern ein neuer Annotation-Typ - als Funktion Modifikationsmittel verwendet werden, wie zum Beispiel @Override.

Siehe hierzu javadocs entry zu dem Thema.

+5

Großen Dank definiert, gut zu wissen. Also, was war der Grund dafür, es @interface zu nennen, anstatt zu sagen, @annotation ich frage mich .. scheint wie ein unnötig überladener Begriff. – Bittercoder

+4

Das Tutorial und die JLS beziehen sich auf eine Anmerkung, die eine spezielle Art von Schnittstelle ist. Es scheint nicht viel Diskussion zu diesem Thema zu geben, aber http://javarunner.blogspot.com/2005/01/annotations-in-java-15.html erklärt, dass Annotationen eine implizite Erweiterung der Annotation-Schnittstelle sind und @ und interface werden verwendet, um sich von einer regulären Schnittstelle zu unterscheiden. Vielleicht möchten Sie auch die JSR-Spezifikation für Anmerkungen lesen. – DavidValeri

+0

@Bittercoder Die Dokumente erwähnen: "Vor der Schlüsselwortschnittstelle steht das At-Zeichen (@) (@ = AT, wie im Anmerkungstyp)". Das ist die ganze Logik, die ich w.r.t finden kann. Benennung. – Shaishav

25

Das Schlüsselwort interface gibt an, dass Sie eine traditionelle Schnittstellenklasse in Java deklarieren.
Das Schlüsselwort @interface wird zum Deklarieren eines neuen Anmerkungstyps verwendet.

Siehe docs.oracle tutorial für Anmerkungen zur Beschreibung der Syntax.
Sehen Sie die JLS, wenn Sie wirklich in die Details von was @interface bedeutet bedeutet.

67

Schnittstelle:

Im Allgemeinen macht eine Schnittstelle einen Vertrag ohne die zugrunde liegenden Implementierungsdetails aussetzt. In objektorientierter Programmierung definieren Schnittstellen abstrakte Typen, die das Verhalten offen legen, aber keine Logik enthalten. Die Implementierung wird durch die Klasse oder den Typ definiert, der die Schnittstelle implementiert.

@interface: (Annotation-Typ)

Nehmen Sie das folgende Beispiel, die eine Menge von Kommentaren:

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 

} 

Statt dessen können Sie einen Annotationstyp

@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(); 
} 
erklären

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

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

+5

nette Erklärung –

+1

Das war eigentlich nützlich. Ich wusste nicht, dass Java das tun könnte. –

+0

Dies sollte die akzeptierte Antwort sein. – instinct

5

interface: den Auftrag für eine Klasse definiert, die es implementiert

@interface: den Auftrag für eine Anmerkung