En Java, es perfectamente legal definir final
argumentos 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, bar
y baz
tiene las final
definiciones opuestas en la clase VS la interfaz.
Del mismo modo, no final
se aplican restricciones cuando un método de clase extiende a otro, ya sea abstract
o no.
Si bien final
tiene algún valor práctico dentro del cuerpo del método de clase, ¿hay algún punto que especifique los final
parámetros del método de interfaz?
final
de todos modos no hace nada con los tipos nativos, ya que están copiados.interface
definiciones varían solo en elfinal
atributo de un argumento, entonces los.class
archivos resultantes son byte por byte de forma idéntica (y, por supuesto,javap -v
producen el mismo resultado). ¡Lo mismo es cierto para dos clases que solo difieren enfinal
un atributo, por cierto!Respuestas:
No parece que tenga sentido. De acuerdo con la Especificación del lenguaje Java 4.12.4 :
Sin embargo, un
final
modificador 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, elfinal
modificador 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
final
modificador 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 transient
campos. ;)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 lafinal
palabra 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
final
parámetros: Frijoles y Objetos (en realidad, ambos son la misma razón, pero contextos ligeramente diferentes ) .Objetos:
La
final
palabra 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 queaddChicken
obtuvo el método. Compare esto con el lugaraddVegetables
donde 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
Object
s 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í comoaddVegetables
podría estropear el proceso de cocción al crear una nueva ollaStringBuilder
y tirarla con la coliflor, también podría hacer lo mismo con una olla JavaBean .fuente
final
en la interfaz, pero que no sea definitivo en la implementación. Habría tenido más sentido si (a) lafinal
palabra 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 comofinal
en la interfaz obligaría a declararlofinal
en 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