2008-10-17 9 views
352

¿Debe anotarse un método que implementa un método de interfaz con @Override?¿Deberíamos @Override la implementación del método de una interfaz?

El javadoc of the Override annotation dice:

Indica que una declaración de método está destinado a anular una declaración de método de una superclase. Si un método se anota con este tipo de anotación pero no anula un método de superclase, los compiladores deben generar un mensaje de error.

No creo que una interfaz sea técnicamente una superclase. ¿O es eso?

Question Elaboration

+5

wow esta pregunta podría ser más corta, pero es la pregunta que necesitaba. Gracias –

+1

No puedo encontrar el reemplazo del artículo @Override (Oracle movió los viejos blogs Sun recientemente). ¿Sabes cómo encontrarlo? –

+3

Deberíamos tener una anotación @Implement (s) por ahora (2015). Eso aclarará las cosas! – Alex

Respuesta

248

que puedes usar @ Override siempre que sea posible. Evita que se cometan errores simples. Ejemplo:

class C { 
    @Override 
    public boolean equals(SomeClass obj){ 
     // code ... 
    } 
} 

Esto no se compila porque no anula correctamente public boolean equals(Object obj).

Lo mismo ocurrirá con los métodos que implementan una interfaz (1.6 y superior solo) o anulan el método de una Super clase.

+138

Tenga en cuenta que ** no puede ** agregar la anotación @Override a un método que implementa una interfaz en Java 5: genera un error. Está permitido en Java 6. –

+14

Um, no, no es así. De hecho, Eclipse se inserta automáticamente @Override al completar los métodos que implementan una interfaz. – jjnguy

+14

-1 hasta que la respuesta incluya una mención sobre el comportamiento diferente de Java 1.5 a 1.6 con respecto a la implementación de un método de interfaz. Solo porque lo he visto es un aspecto confuso para las personas y realmente merece una mención. – Grundlefleck

90

Creo que el comportamiento de javac ha cambiado - con 1.5 prohibió la anotación, con 1.6 no lo hace. La anotación proporciona una verificación adicional en tiempo de compilación, por lo tanto, si está utilizando 1.6, lo intentaré.

+0

¿Cuál es el cheque adicional? –

+15

@Michael Puede observar si se eliminó alguna interfaz. –

+2

@Sangdol +1 Es la única respuesta concreta y válida a la pregunta original. –

3

La anulación de sus propios métodos heredados de sus propias clases normalmente no se interrumpirá en refactorizaciones utilizando un ide. Pero si anula un método heredado de una biblioteca, se recomienda usarlo. Si no lo haces, a menudo no obtendrás ningún error en un cambio de biblioteca posterior, sino un error bien oculto.

1

Eclipse agregará la anotación @Override cuando le dice que "genere métodos no implementados" durante la creación de una clase que implementa una interfaz.

2

Para mí, muchas veces esta es la única razón por la que algunos códigos requieren la compilación de Java 6. No estoy seguro de si vale la pena.

+14

Vale la pena ... – Thilo

11

JDK 5.0 no le permite utilizar la anotación @Override si está implementando el método declarado en la interfaz (su error de compilación), pero JDK 6.0 lo permite. Entonces puede ser que pueda configurar su preferencia de proyecto de acuerdo a sus requerimientos.

3

No es un problema con JDK. En Eclipse Helios, permite la anotación @Override para los métodos de interfaz implementados, cualquiera que sea el JDK 5 o 6. En cuanto a Eclipse Galileo, la anotación @Override no está permitida, cualquiera JDK 5 o 6.

48

Siempre debe anotar los métodos con @Override si está disponible.

En JDK 5 esto significa reemplazar métodos de superclases, en JDK 6, y 7 significa reemplazar métodos de superclases e implementar métodos de interfaces. La razón, como se mencionó anteriormente, es que le permite al compilador detectar errores donde cree que está anulando (o implementando) un método, pero en realidad está definiendo un nuevo método (firma diferente).

El ejemplo equals(Object) contra equals(YourObject) es un ejemplo estándar, pero el mismo argumento se puede hacer para las implementaciones de interfaz.

Me imagino que la razón por la que no es obligatorio anotar la implementación de métodos de interfaces es que JDK 5 marcó esto como un error de compilación. Si JDK 6 hizo esta anotación obligatoria, rompería la compatibilidad con versiones anteriores.

No soy un usuario de Eclipse, pero en otros IDEs (IntelliJ), la anotación @Override solo se agrega al implementar métodos de interfaz si el proyecto está configurado como un proyecto JDK 6+. Me imagino que Eclipse es similar.

Sin embargo, hubiera preferido ver una anotación diferente para este uso, tal vez una anotación @Implements.

+2

+1, esta respuesta es la única que explica la situación. – Pacerier

1

El problema con la inclusión de la @Override es que hace pensar que se olvidó de llamar al método super.theOverridenMethod(), que es muy confuso . Esto debe ser claro como el cristal. Tal vez Java debería ofrecer un @Interface para ser utilizado aquí. Oh, bueno, otro a medias peculiaridad de Java ...

+3

Llamar a alguien súper, cuando no se implementa una interfaz, no es algo que siempre necesite o desee hacer. A veces, agrega funcionalidad, por lo que la llama. Otras veces, está reemplazando la funcionalidad, por lo que no la llama. Un autor de API debe documentar si se basa en la funcionalidad interna o no y crear un contrato documentado sobre cómo la clase se puede extender correctamente. – lilbyrdie

1

Si un hormigón de clase no es primordial un método abstracto, utilizando @Override para aplicación es una cuestión abierta ya que el compilador invariablemente se le advertirá de cualquier método no implementado. En estos casos, se puede argumentar que le resta legibilidad: hay más cosas que leer en el código y, en menor grado, se llama @Override y no @Implement.

-1

En java 6 y versiones posteriores, puede usar @Override para un método que implementa una interfaz.

Pero, no creo que tenga sentido: anular significa que tienes un método en la superclase, y lo estás implementando en la subclase.

Si está implementando una interfaz, creo que deberíamos usar @Implement u otra cosa, pero no el @Override.

0

Al leer el Javadoc en java8, usted puede encontrar lo siguiente en la declaración de interfaz de Anulación:

Si un método está anotado con esta anotación se requieren tipo compiladores para generar un mensaje de error a no ser que al menos una de las se cumplen las siguientes condiciones:

  • El método reemplaza o implementa un método declarado en un supertipo.
  • El método tiene una anotación que es anulada, equivalente a la de cualquier método público declarado en {@linkplain Object}.

Por lo tanto, al menos en java8, debe usar @Override en una implementación de un método de interfaz.

Cuestiones relacionadas