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 la final
palabra clave.
En cuanto a la pregunta, me gustaría citar mi propio comentario a continuación.
Creo que no estás obligado a implementar la finalidad de un argumento para dejarte libre de decidir si debe ser final o no en tu propia implementación.
Pero sí, suena bastante extraño que pueda declararlo final
en la interfaz, pero que no sea definitivo en la implementación. Hubiera tenido más sentido si:
a. final
la 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 como final
en la interfaz obligaría a que se declare final
en la implementación (pero no forzado para no finales).
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:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
// ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth
// We forgot to add cauliflower. It went into the wrong pot.
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
// ^--- Assignment allowed...
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
//cookingPot = new StringBuilder(cookingPot.toString());
// ^---- COMPILATION ERROR! It is final.
cookingPot.append("ChickenBroth ");
}
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 que addChicken
obtuvo el método. Compare esto con el lugar addVegetables
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í como addVegetables
podría estropear el proceso de cocción al crear una nueva olla StringBuilder
y tirarla con la coliflor, también podría hacer lo mismo con una olla JavaBean .
final
de todos modos no hace nada con los tipos nativos, ya que están copiados.