Qual è la differenza tra interfaccia e @interface in java?


306

Non tocco Java da quando utilizzo JBuilder alla fine degli anni '90 mentre ero all'università, quindi sono un po 'fuori contatto - in ogni caso ho lavorato su un piccolo progetto Java questa settimana e ho usato Intellij IDEA come mio IDE , per un cambio di passo rispetto al mio normale sviluppo .Net.

Ho notato che ha il supporto per l'aggiunta di interfacce e @interfaces, che cos'è un'interfaccia @ e in cosa differisce da un'interfaccia normale?

public interface Test {
}

vs.

public @interface Test {
}

Ho fatto un po 'di ricerche, ma non sono riuscito a trovare molte informazioni utili riguardanti @interface.

Risposte:


322

Il simbolo @ indica una definizione del tipo di annotazione.

Ciò significa che non è in realtà un'interfaccia, ma piuttosto un nuovo tipo di annotazione - da utilizzare come modificatore di funzione, come @override .

Vedi questa voce javadocs sull'argomento.


7
Grazie mille, buono a sapersi. Quindi qual è stata la logica per chiamarlo @interface, piuttosto che dire @annotation Mi chiedo .. sembra un termine inutilmente sovraccarico.
Bittercoder,

5
Il tutorial e JLS alludono a un'annotazione che è un tipo speciale di interfaccia. Non sembra esserci molta discussione sull'argomento, ma javarunner.blogspot.com/2005/01/annotations-in-java-15.html spiega che le annotazioni sono un'estensione implicita dell'interfaccia di annotazione e di @ e interfaccia sono usati per differenziarsi insieme da un'interfaccia normale. Potresti anche voler leggere la specifica JSR per le annotazioni.
David Valeri,

1
@Bittercoder menzionato dai documenti: "L'interfaccia della parola chiave è preceduta dal segno at (@) (@ = AT, come nel tipo di annotazione)". Questa è tutta la logica che posso trovare nei nomi di Wrt.
Shaishav,

112

interfaccia:

In generale, un'interfaccia espone un contratto senza esporre i dettagli di implementazione sottostanti. Nella programmazione orientata agli oggetti, le interfacce definiscono tipi astratti che espongono il comportamento, ma non contengono alcuna logica. L'implementazione è definita dalla classe o dal tipo che implementa l'interfaccia.

@interfaccia: (tipo di annotazione)

Prendi l'esempio seguente, che ha molti commenti:

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

}

Invece di questo, puoi dichiarare un tipo di annotazione

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

che può quindi annotare una classe come segue:

@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: molte annotazioni sostituiscono i commenti nel codice.

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


11
bella spiegazione
Pat B

2
Questo è stato davvero utile. Non sapevo che Java potesse farlo.
Jay Sidri,

La risposta precedente includeva questo link da cui provenivano queste informazioni. Ho trovato utile trovare ulteriori informazioni su questo argomento. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
Una delle risposte migliori e complete (ancora chiare) a cui ho assistito su StackOverflow.
Mr. D

32

La interfaceparola chiave indica che stai dichiarando una classe di interfaccia tradizionale in Java.
La @interfaceparola chiave viene utilizzata per dichiarare un nuovo tipo di annotazione.

Vedi il tutorial di docs.oracle sulle annotazioni per una descrizione della sintassi.
Vedi il JLS se vuoi davvero entrare nei dettagli di ciò che @interfacesignifica.


18

interface: definisce il contratto per una classe che lo implementa

@interface: definisce il contratto per un'annotazione


8

l'interfaccia nel linguaggio di programmazione Java è un tipo astratto che viene utilizzato per specificare un comportamento che le classi devono implementare. Sono simili ai protocolli. Le interfacce sono dichiarate usando la parola chiave interface

@interface viene utilizzato per creare le proprie annotazioni Java (personalizzate). Le annotazioni sono definite nel proprio file, proprio come una classe o un'interfaccia Java. Ecco un esempio di annotazione Java personalizzato:

@interface MyAnnotation {

    String   value();

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

}

Questo esempio definisce un'annotazione chiamata MyAnnotation che ha quattro elementi. Nota la parola chiave @interface. Questo segnala al compilatore Java che questa è una definizione di annotazione Java.

Si noti che ogni elemento è definito in modo simile alla definizione di un metodo in un'interfaccia. Ha un tipo di dati e un nome. È possibile utilizzare tutti i tipi di dati primitivi come tipi di dati elemento. È inoltre possibile utilizzare le matrici come tipo di dati. Non è possibile utilizzare oggetti complessi come tipo di dati.

Per utilizzare l'annotazione sopra, è possibile utilizzare il codice in questo modo:

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


}

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.