¿Deberíamos @Override la implementación del método de una interfaz?

Resuelto Benno Richters asked hace 16 años • 15 respuestas

¿ Debería anotarse un método que implemente un método de interfaz @Override?

El javadoc de la Overrideanotació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

Benno Richters avatar Oct 17 '08 22:10 Benno Richters
Aceptado

Debes utilizarlo @Overridesiempre 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.

jjnguy avatar Oct 17 '2008 15:10 jjnguy

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.

Jon Skeet avatar Oct 17 '2008 15:10 Jon Skeet

Siempre debes anotar los métodos @Overridesi 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 @Overrideanotació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 @Implementsanotación.

GKelly avatar Nov 25 '2011 09:11 GKelly

Lo usaría en cada oportunidad. Consulte ¿Cuándo se utiliza la anotación @Override de Java y por qué?

Alex B avatar Oct 17 '2008 15:10 Alex B