2009-06-17 11 views

Respuesta

53

Tiendo a preferir el uso de @Override en este caso, de modo que el método se marque en las subclases si la superclase cambia (eliminando el método por completo, o cambiando su firma, etc.).

La única diferencia real es que sin la anotación, si el método en la superclase/interfaz se cambia o elimina, la implementación en cuestión simplemente se convierte en un método "normal" de esa clase. Por lo tanto, debe agregar la anotación si está implementando el método únicamente para cumplir el contrato; y probablemente no debería agregarlo si el método tiene sentido en su clase, independientemente de las interfaces implementadas o los métodos abstractos heredados.

+4

También necesita Java 6 para aprovechar esta anotación. Java 5 no le permite ubicarlo en implementaciones de interfaz. – akarnokd

13

Sí. Es una práctica recomendada por Joshua Bloch en Java efectivo.

19

Sí. - una vez más, le dice al compilador, "Realmente quiero ser sustituir un método que aquí Si hay no es un procedimiento correspondiente para anular, he cometido un error y quieren que les digan al respecto ! "

Personalmente, creo que es una pena que esto sea solo una anotación en lugar de parte del lenguaje (como en C#), pero ese es el beneficio de la retrospectiva, por supuesto.

+0

+1 para la "prueba de regresión" – guerda

+1

Eso me salvó la piel unas cuantas veces. –

6

En realidad, Joshua Bloch, en el último párrafo de la página 178 en Effective Java (2ª Ed.), dice que no es esencial para los métodos de clases concretas que tienen preferencia sobre los métodos abstractos de utilizar la anotación Override porque el compilador dar un error de todos modos. Sin embargo, "no es dañino hacerlo".

Recomiendo elegir una estrategia y seguir con ella constantemente.

+0

El compilador daría un error de todos modos? ¿Quiere decir que si una clase concreta implementa un método que no es un método abstracto de una superclase, el compilador se quejaría de ello? Eso no puede ser lo que quieres decir, pero no puedo entender lo que quieres decir. – LarsH

+1

@LarsH Quiere decir que el compilador dará un error si la clase concreta no implementa un método abstracto en la superclase, que sería el caso si escribes mal el nombre del método abstracto que la subclase necesita implementar. –

+1

@espertus: Gracias por la aclaración. De modo que no obtendría un error o advertencia si, como dijo Andrzej, el método en la superclase/interfaz se cambia o elimina. – LarsH

Cuestiones relacionadas