¿Cuál es la diferencia entre interface y @interface en java?

306

No he tocado Java desde que usé JBuilder a fines de los 90 mientras estaba en la Universidad, así que estoy un poco fuera de contacto, de todos modos, he estado trabajando en un pequeño proyecto Java esta semana y usando Intellij IDEA como mi IDE , para un cambio de ritmo de mi desarrollo regular .Net.

Noté que tiene soporte para agregar interfaces y @interfaces, ¿qué es una @interface y cómo se diferencia de una interfaz normal?

public interface Test {
}

vs.

public @interface Test {
}

He buscado un poco, pero no he podido encontrar una gran cantidad de información útil que se refiera a @interface.

Bittercoder
fuente

Respuestas:

322

El símbolo @ denota una definición de tipo de anotación.

Eso significa que no es realmente una interfaz, sino más bien un nuevo tipo de anotación, que se utilizará como un modificador de función, como @override .

Vea esta entrada de javadocs sobre el tema.

mrkishi
fuente
77
Muchas gracias, es bueno saberlo. Entonces, ¿cuál fue la razón para llamarlo @interface, en lugar de decir @ anotación, me pregunto ... parece un término innecesariamente sobrecargado.
Bittercoder
55
El tutorial y el JLS aluden a una anotación que es un tipo especial de interfaz. No parece haber mucha discusión sobre el tema, pero javarunner.blogspot.com/2005/01/annotations-in-java-15.html explica que las anotaciones son una extensión implícita de la interfaz de Anotación y @ e interfaz se usan para diferenciar juntos de una interfaz normal. También puede leer la especificación JSR para anotaciones.
DavidValeri
1
@Bittercoder que mencionan los documentos: "la interfaz de palabras clave está precedida por el signo at (@) (@ = AT, como en el tipo de anotación)". Esa es toda la razón por la que puedo encontrar nombres de wrt.
Shaishav
112

interfaz:

En general, una interfaz expone un contrato sin exponer los detalles de implementación subyacentes. En la programación orientada a objetos, las interfaces definen tipos abstractos que exponen el comportamiento, pero no contienen lógica. La implementación se define por la clase o tipo que implementa la interfaz.

@interface: (tipo de anotación)

Tome el siguiente ejemplo, que tiene muchos comentarios:

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

}

En lugar de esto, puede declarar un tipo de anotación

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

que luego puede anotar una clase de la siguiente manera:

@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

}

PD: muchas anotaciones reemplazan los comentarios en el código.

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

tordo músico
fuente
11
buena explicación
Pat B
2
Eso fue realmente útil. No sabía que Java podría hacer esto.
Jay Sidri
La respuesta anterior incluía este enlace que es de donde proviene esta información. Me resultó útil encontrar más información sobre este tema. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Una de las mejores y completas respuestas (aún claras) que he presenciado en stackoverflow.
Sr. D
32

La interfacepalabra clave indica que está declarando una clase de interfaz tradicional en Java.
La @interfacepalabra clave se utiliza para declarar un nuevo tipo de anotación.

Consulte el tutorial docs.oracle sobre anotaciones para obtener una descripción de la sintaxis.
Vea el JLS si realmente quiere entrar en detalles sobre lo que @interfacesignifica.

DavidValeri
fuente
18

interface: define el contrato para una clase que lo implementa

@interface: define el contrato para una anotación

Emmanuel Osimosu
fuente
8

La interfaz en el lenguaje de programación Java es un tipo abstracto que se utiliza para especificar un comportamiento que las clases deben implementar. Son similares a los protocolos. Las interfaces se declaran utilizando la palabra clave de interfaz

@interface se utiliza para crear sus propias anotaciones Java (personalizadas). Las anotaciones se definen en su propio archivo, al igual que una clase o interfaz Java. Aquí hay un ejemplo de anotación Java personalizado:

@interface MyAnnotation {

    String   value();

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

}

Este ejemplo define una anotación llamada MyAnnotation que tiene cuatro elementos. Observe la palabra clave @interface. Esto le indica al compilador de Java que esta es una definición de anotación de Java.

Observe que cada elemento se define de manera similar a la definición de un método en una interfaz. Tiene un tipo de datos y un nombre. Puede usar todos los tipos de datos primitivos como tipos de datos de elementos. También puede usar matrices como tipo de datos. No puede usar objetos complejos como tipo de datos.

Para usar la anotación anterior, puede usar un código como este:

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


}

Referencia: http://tutorials.jenkov.com/java/annotations.html

Piyush Singh
fuente