interface ¿qué - ¿Cuál es la diferencia entre la interfaz y la interfaz @ en java?




asociarías código (5)

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. Al menos, he estado trabajando en un pequeño proyecto de Java esta semana y uso Intellij IDEA como mi IDE , para un cambio de ritmo de mi desarrollo regular .Net.

Me doy cuenta de que tiene soporte para agregar interfaces y @interfaces, ¿qué es un @interface y en qué se diferencia de una interfaz normal?

public interface Test {
}

contra

public @interface Test {
}

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


Answers

interface: define el contrato para una clase que lo implementa

@interface: define el contrato para una anotación


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, 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


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

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

Ver esta entrada javadocs sobre el tema.


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

Consulte el http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html sobre las anotaciones para obtener una descripción de la sintaxis.
Vea el JLS si realmente quiere entrar en los detalles de lo que significa @interface .


Siempre que exista la más mínima posibilidad de que la cadena dada no contenga un entero, debe manejar este caso especial. Lamentablemente, los métodos estándar de Java Integer::parseInt y Integer::valueOf NumberFormatException una NumberFormatException para señalar este caso especial. Por lo tanto, tiene que usar excepciones para el control de flujo, que generalmente se considera un estilo de codificación incorrecto.

En mi opinión, este caso especial debe manejarse devolviendo un Optional<Integer> . Ya que Java no ofrece tal método, uso el siguiente envoltorio:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

Uso:

// prints 1234
System.out.println(tryParseInteger("1234").orElse(-1));
// prints -1
System.out.println(tryParseInteger("foobar").orElse(-1));

Si bien esto sigue utilizando excepciones para el control de flujo internamente, el código de uso se vuelve muy limpio.





java interface annotations language-features