2012-03-21 14 views
5

Estoy usando el complemento eclipse checkstyle. Tengo algunos métodos en una clase A, que son sobreescritos en la clase B. Tengo el siguiente aviso para la mayoría de los métodos¿Por qué CheckStyle sugiere que utilizo un método final?

La función SearchAndReplace no está concebido para ser heredado
- que debe declararse abstracta o definitiva o déjalo vacío.

¿Hay alguna ventaja en declarar un método como definitivo?

EDITAR

sé cuál es la palabra clave final es para. Sé que evita la anulación de los métodos, ¿hay otras ventajas, como el rendimiento o algo por el estilo?

+1

¡No se puede anular un método final! – Rakesh

+1

Tengo curiosidad por saber cómo el plugin puede saber cómo se concibió el método. – EJP

Respuesta

12

Cuando declara que un método es definitivo, está diciendo que el método no puede anularse.

Presupuesto de la especificación del lenguaje Java:

Un método puede ser declarado final para evitar las subclases sustituyan o ocultarlo.

Es un error en tiempo de compilación intentar anular u ocultar un método final.

El lema común (debido a Joshua Bloch creo) es

                      "Diseño y documentos para la herencia o prohíba lo contrario"

Entonces, a menos que su intención sea dejar que las subclases anulen el método (y potencialmente cambien el comportamiento de f la superclase (todos los métodos son virtual en Java)) luego haga que el método sea definitivo.

0

En Java, palabra clave final se aplica en varios contexto:

La palabra clave final es significa un modificador de la clase final no puede ser extendido, una variable no se puede modificar, y también un método puede no ser anulado

4

Un método final garantiza que ninguna subclase anulará el método. Lo más probable es que el tiempo de ejecución pueda aprovechar esto para una ganancia de rendimiento (que puede ser leve).

La razón principal para hacer un método final es detener los herederos que anulan el método. Esta podría ser una consideración importante (por ejemplo, imagina un método llamado bool checkSecurity() - ¡dejar que otros anulen esto sería malo!)

0

Cuando un método se declara como final, es seguro invocarlo en el constructor (a menos que se utilicen otros métodos no finales) invocado en ella). Si no es final, las subclases pueden anularlo de una manera que intente acceder a los campos introducidos en la subclase. Y esto a menudo no será lo que esperas. Creo que hay algún beneficio en el rendimiento cuando escribe para dispositivos móviles, pero no soy experto allí.

Cuestiones relacionadas