En Java, es perfectamente legal definir finalargumentos en métodos de interfaz y no obedecer eso en la clase de implementación, por ejemplo:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
En el ejemplo anterior, bary baztiene las finaldefiniciones opuestas en la clase VS la interfaz.
Del mismo modo, no finalse aplican restricciones cuando un método de clase extiende a otro, ya sea abstracto no.
Si bien finaltiene algún valor práctico dentro del cuerpo del método de clase, ¿hay algún punto que especifique los finalparámetros del método de interfaz?

finalde todos modos no hace nada con los tipos nativos, ya que están copiados.interfacedefiniciones varían solo en elfinalatributo de un argumento, entonces los.classarchivos resultantes son byte por byte de forma idéntica (y, por supuesto,javap -vproducen el mismo resultado). ¡Lo mismo es cierto para dos clases que solo difieren enfinalun atributo, por cierto!Respuestas:
No parece que tenga sentido. De acuerdo con la Especificación del lenguaje Java 4.12.4 :
Sin embargo, un
finalmodificador en un parámetro de método no se menciona en las reglas para hacer coincidir las firmas de los métodos anulados, y no tiene ningún efecto en la persona que llama, solo dentro del cuerpo de una implementación. Además, como señaló Robin en un comentario, elfinalmodificador en un parámetro de método no tiene efecto en el código de bytes generado. (Esto no es cierto para otros usos definal).fuente
finalmodificador no se aplica en la clase implementadora. La firma de su interfaz puede simplemente mentir.Algunos IDE copiarán la firma del método abstracto / interfaz al insertar un método de implementación en una subclase.
No creo que haga ninguna diferencia para el compilador.
EDITAR: Si bien creo que esto era cierto en el pasado, no creo que los IDE actuales sigan haciendo esto.
fuente
static transientcampos. ;)Las anotaciones finales de los parámetros del método siempre son relevantes para la implementación del método, nunca para la persona que llama. Por lo tanto, no hay una razón real para usarlos en las firmas de métodos de interfaz. A menos que desee seguir el mismo estándar de codificación consistente, que requiere parámetros de método finales, en todas las firmas de métodos. Entonces es bueno poder hacerlo.
fuente
Actualización: la respuesta original a continuación se escribió sin comprender completamente la pregunta y, por lo tanto, no aborda directamente la pregunta.
:)Sin embargo, debe ser informativa para aquellos que buscan comprender el uso general de lafinalpalabra clave.En cuanto a la pregunta, me gustaría citar mi propio comentario a continuación.
Puedo pensar en dos razones por las que una firma de método puede tener
finalparámetros: Frijoles y Objetos (en realidad, ambos son la misma razón, pero contextos ligeramente diferentes ) .Objetos:
La
finalpalabra clave aseguró que no crearemos accidentalmente una nueva olla local al mostrar un error de compilación cuando intentamos hacerlo. Esto aseguró que el caldo de pollo se agregue a nuestra olla original queaddChickenobtuvo el método. Compare esto con el lugaraddVegetablesdonde perdimos la coliflor porque agregó eso a una nueva olla local en lugar de la olla original que tenía.Frijoles: es el mismo concepto que los objetos (como se muestra arriba) . Los frijoles son esencialmente
Objects en Java. Sin embargo, los beans (JavaBeans) se utilizan en diversas aplicaciones como una forma conveniente de almacenar y pasar una colección definida de datos relacionados. Así comoaddVegetablespodría estropear el proceso de cocción al crear una nueva ollaStringBuildery tirarla con la coliflor, también podría hacer lo mismo con una olla JavaBean .fuente
finalen la interfaz, pero que no sea definitivo en la implementación. Habría tenido más sentido si (a) lafinalpalabra clave no estaba permitida para los argumentos del método de interfaz (abstracto) (pero puede usarla en la implementación), o (b) declarar un argumento comofinalen la interfaz obligaría a declararlofinalen la implementación (pero no forzado para no finales).:)Creo que puede ser un detalle superfluo, ya que si es final o no es un detalle de implementación.
(Algo así como declarar métodos / miembros en una interfaz como pública).
fuente