Quelle est la différence entre l'interface et @interface en Java?

306

Je n'ai pas touché à Java depuis que j'utilise JBuilder à la fin des années 90 alors que j'étais à l'université, donc je suis un peu déconnecté - en tout cas, je travaille sur un petit projet Java cette semaine, et j'utilise Intellij IDEA comme IDE , pour un changement de rythme par rapport à mon développement .Net régulier.

Je remarque qu'il prend en charge l'ajout d'interfaces et @interfaces, qu'est-ce qu'une @interface et en quoi diffère-t-il d'une interface normale?

public interface Test {
}

contre.

public @interface Test {
}

J'ai fait un peu de recherche, mais je n'ai pas trouvé beaucoup d'informations utiles concernant @interface.

Bittercoder
la source

Réponses:

322

Le symbole @ indique une définition de type d'annotation.

Cela signifie que ce n'est pas vraiment une interface, mais plutôt un nouveau type d'annotation - à utiliser comme modificateur de fonction, comme @override .

Voir cette entrée javadocs sur le sujet.

mrkishi
la source
7
Grand merci, bon à savoir. Alors, quelle était la raison de l'appeler @interface, plutôt que de dire @annotation, je me demande .. semble être un terme inutilement surchargé.
Bittercoder
5
Le didacticiel et le JLS font allusion à une annotation étant un type spécial d'interface. Il ne semble pas y avoir beaucoup de discussions sur le sujet, mais javarunner.blogspot.com/2005/01/annotations-in-java-15.html explique que les annotations sont une extension implicite de l'interface Annotation et @ et de l'interface sont utilisés pour différencier ensemble une interface régulière. Vous pouvez également lire la spécification JSR pour les annotations.
DavidValeri
1
@Bittercoder les documents mentionnent: "l'interface de mot-clé est précédée du signe at (@) (@ = AT, comme dans le type d'annotation)". C'est toute la justification que je peux trouver par nom.
Shaishav
112

interface:

En général, une interface expose un contrat sans exposer les détails d'implémentation sous-jacents. Dans la programmation orientée objet, les interfaces définissent des types abstraits qui exposent le comportement, mais ne contiennent aucune logique. L'implémentation est définie par la classe ou le type qui implémente l'interface.

@interface: (type d'annotation)

Prenons l'exemple ci-dessous, qui contient de nombreux commentaires:

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

}

Au lieu de cela, vous pouvez déclarer un type d'annotation

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

qui peut ensuite annoter une classe comme suit:

@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: de nombreuses annotations remplacent les commentaires dans le code.

Référence: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

mavis
la source
11
belle explication
Pat B
2
C'était vraiment utile. Je ne savais pas que Java pouvait faire ça.
Jay Sidri
La réponse précédente incluait ce lien d'où proviennent ces informations. J'ai trouvé utile de trouver plus d'informations sur ce sujet. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
L'une des meilleures réponses complètes (encore claire) que j'ai vue sur stackoverflow.
M. D
32

Le interfacemot-clé indique que vous déclarez une classe d'interface traditionnelle en Java.
le@interface mot clé est utilisé pour déclarer un nouveau type d'annotation.

Voir le didacticiel docs.oracle sur les annotations pour une description de la syntaxe.
Voir le JLS si vous voulez vraiment entrer dans les détails de ce que cela @interfacesignifie.

DavidValeri
la source
18

interface: définit le contrat d'une classe qui le met en œuvre

@interface: définit le contrat d'une annotation

Emmanuel Osimosu
la source
8

interface dans le langage de programmation Java est un type abstrait qui est utilisé pour spécifier un comportement que les classes doivent implémenter. Ils sont similaires aux protocoles. Les interfaces sont déclarées à l'aide du mot-clé interface

@interface est utilisé pour créer vos propres annotations Java (personnalisées). Les annotations sont définies dans leur propre fichier, tout comme une classe ou une interface Java. Voici un exemple d'annotation Java personnalisé:

@interface MyAnnotation {

    String   value();

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

}

Cet exemple définit une annotation appelée MyAnnotation qui comporte quatre éléments. Remarquez le mot-clé @interface. Cela signale au compilateur Java qu'il s'agit d'une définition d'annotation Java.

Notez que chaque élément est défini de manière similaire à une définition de méthode dans une interface. Il a un type de données et un nom. Vous pouvez utiliser tous les types de données primitifs comme types de données d'élément. Vous pouvez également utiliser des tableaux comme type de données. Vous ne pouvez pas utiliser des objets complexes comme type de données.

Pour utiliser l'annotation ci-dessus, vous pouvez utiliser du code comme celui-ci:

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


}

Référence - http://tutorials.jenkov.com/java/annotations.html

Piyush Singh
la source