¿Cuál es la diferencia entre interfaz y @interface en java?
No he tocado Java desde que usé JBuilder a finales de los 90 mientras estaba en la Universidad, así que estoy un poco fuera de contacto; en cualquier caso, he estado trabajando en un pequeño proyecto de Java esta semana y usando Intellij IDEA como mi IDE. , para cambiar el ritmo de mi desarrollo habitual de .Net.
Noto que tiene soporte para agregar interfaces e @interfaces, ¿qué es una @interface y en qué se diferencia de una interfaz normal?
public interface Test {
}
vs.
public @interface Test {
}
He buscado un poco, pero no pude encontrar mucha información útil referente a @interface.
El símbolo @ indica 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 modificador de función, como @override .
Vea esta entrada de javadocs sobre el tema.
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 está definida por la clase o tipo que implementa la interfaz.
@interface: (tipo de anotación)
Tomemos 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, puedes 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
La interface
palabra clave indica que está declarando una clase de interfaz tradicional en Java.
La @interface
palabra clave se utiliza para declarar un nuevo tipo de anotación.
Consulte el tutorial de docs.oracle sobre anotaciones para obtener una descripción de la sintaxis.
Consulte el JLS si realmente desea entrar en detalles sobre lo que @interface
significa.
interface:
define el contrato para una clase que lo implementa
@interface:
define el contrato para una anotación
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 interface.
@interface se utiliza para crear sus propias anotaciones Java (personalizadas). Las anotaciones se definen en su propio archivo, como una clase o interfaz Java. A continuación se muestra un ejemplo de anotación Java personalizada:
@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 se trata de 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 utilizar todos los tipos de datos primitivos como tipos de datos de elementos. También puede utilizar matrices como tipo de datos. No puede utilizar objetos complejos como tipo de datos.
Para usar la anotación anterior, puedes 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