2009-05-27 1 views
187

No he tocado Java desde que usé JBuilder a finales de los 90 mientras estaba en la universidad, así que estoy un poco desconectado, de todos modos he estado trabajando en un pequeño proyecto de Java esta semana, y usando Intellij IDEA como mi IDE, para un cambio de ritmo de mi desarrollo regular de .Net.¿Cuál es la diferencia entre interfaz y @interface en java?

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

public interface Test { 
} 

vs

public @interface Test { 
} 

He hecho un poco de búsqueda, pero no pude encontrar una gran cantidad de información útil en referencia a @interface.

Respuesta

198

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

Esto significa que es no realmente una interfaz, sino más bien un nuevo tipo de anotación - para ser utilizado como un modificador de la función, como @ Override.

Consulte este javadocs entry sobre el tema.

+5

Grandes gracias, es bueno saber. Entonces, ¿cuál fue la razón para llamarlo @interface, en lugar de decir @annotation Me pregunto ... parece un término innecesariamente sobrecargado. – Bittercoder

+4

El tutorial y el JLS aluden a que una anotación es un tipo especial de interfaz. No parece haber mucha discusión sobre el tema, pero http://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 utilizan para diferenciar juntos de una interfaz regular. También puede leer la especificación JSR para anotaciones. – DavidValeri

+0

@Bittercoder los documentos mencionan: "la interfaz de palabra 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 w.r.t. nombrando – Shaishav

25

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

Consulte docs.oracle tutorial en las anotaciones para obtener una descripción de la sintaxis.
Consulte JLS si realmente desea conocer los detalles de lo que significa @interface.

67

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 ejemplo de abajo, que tiene una gran cantidad de 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, se 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 

} 

PS: Muchas anotaciones reemplazan los comentarios en el código.

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

+5

buena explicación –

+1

Eso fue realmente útil. No sabía que Java podría hacer esto. –

+0

Esta debería ser la respuesta aceptada. – instinct

5

interface: define el contrato para una clase que lo implementa

@interface: define el contrato para una anotación

Cuestiones relacionadas