¿Deberíamos @Override la implementación del método de una interfaz?
¿ Debería anotarse un método que implemente un método de interfaz @Override
?
El javadoc de la Override
anotación dice:
Indica que una declaración de método está destinada a anular una declaración de método en una superclase. Si un método está anotado con este tipo de anotación pero no anula un método de superclase, se requiere que los compiladores generen un mensaje de error.
No creo que una interfaz sea técnicamente una superclase. ¿O es eso?
Question Elaboration
Debes utilizarlo @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 se aplica a los métodos que implementan una interfaz ( solo 1.6 y superiores ) o anulan el método de una superclase.
Creo que el comportamiento de javac ha cambiado: con 1.5 prohibía la anotación, con 1.6 no. La anotación proporciona una verificación adicional en tiempo de compilación, por lo que si estás usando 1.6, lo haría.
Siempre debes anotar los métodos @Override
si están disponibles.
En JDK 5, esto significa anular métodos de superclases, en JDK 6 y 7 significa anular métodos de superclases e implementar métodos de interfaces. La razón, como se mencionó anteriormente, es que permite que el compilador detecte errores en los que cree que está anulando (o implementando) un método, pero en realidad está definiendo un nuevo método (firma diferente).
El ejemplo equals(Object)
versus equals(YourObject)
es un ejemplo estándar, pero se puede presentar el mismo argumento para las implementaciones de interfaz.
Me imagino que la razón por la que no es obligatorio anotar los métodos de implementación de las interfaces es que JDK 5 marcó esto como un error de compilación. Si JDK 6 hiciera obligatoria esta anotación, se rompería la compatibilidad con versiones anteriores.
No soy un usuario de Eclipse, pero en otros IDE (IntelliJ), la @Override
anotación 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 @Implements
anotación.
Lo usaría en cada oportunidad. Consulte ¿Cuándo se utiliza la anotación @Override de Java y por qué?