web-dev-qa-db-fra.com

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

Je n'ai pas touché à Java depuis l'utilisation de JBuilder à la fin des années 90 alors que je travaillais à l'université. Je suis donc un peu en retrait. En tout cas, j'ai travaillé sur un petit projet Java cette semaine et j'utilise Intellij IDEA. ] comme mon IDE, pour changer de rythme par rapport à mon développement .Net habituel.

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

public interface Test {
}

vs.

public @interface Test {
}

J'ai fait quelques recherches, mais je n'ai pas trouvé beaucoup d'informations utiles concernant @interface.

242
Bittercoder

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

Cela signifie que c'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.

262
mrkishi

interface:

En général, une interface expose un contrat sans exposer les détails de la mise en œuvre sous-jacente. 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 a beaucoup de 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

89
mavis

Le mot clé interface indique que vous déclarez une classe d'interface traditionnelle en Java.
Le mot clé @interface permet de déclarer un nouveau type d'annotation. 

Voir docs.Oracle tutorial on annotations pour une description de la syntaxe.
Voir le JLS si vous voulez vraiment entrer dans les détails de ce que @interface signifie.

31
DavidValeri

interface: définit le contrat d'une classe qui l'implémente

@interface: définit le contrat pour une annotation 

13
eosimosu

interface dans le langage de programmation Java est un type abstrait 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. Notez le mot clé @interface. Cela indique au compilateur Java qu'il s'agit d'une définition d'annotation Java.

Notez que chaque élément est défini de la même manière qu'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 en tant que types de données d'élément. Vous pouvez également utiliser des tableaux comme type de données. Vous ne pouvez pas utiliser d'objets complexes en tant que type de données.

Pour utiliser l'annotation ci-dessus, vous pouvez utiliser le code suivant:

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


}

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

0
Piyush Singh