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 finalpalabra 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 finalen la interfaz, pero que no sea definitivo en la implementación. Hubiera tenido más sentido si:
a. finalla 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 finalen la interfaz obligaría a que se declare finalen la implementación (pero no forzado para no finales).
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:
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 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 que addChickenobtuvo el método. Compare esto con el lugar addVegetablesdonde 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í como addVegetablespodría estropear el proceso de cocción al crear una nueva olla StringBuildery tirarla con la coliflor, también podría hacer lo mismo con una olla JavaBean .
finalde todos modos no hace nada con los tipos nativos, ya que están copiados.