Atualização: A resposta original abaixo foi escrita sem o entendimento completo da pergunta e, portanto, não a aborda diretamente. :)
No entanto, deve ser informativa para quem deseja entender o uso geral da final
palavra-chave.
Quanto à questão, gostaria de citar meu próprio comentário abaixo.
Acredito que você não seja forçado a implementar a finalidade de um argumento para deixá-lo livre para decidir se deve ser final ou não em sua própria implementação.
Mas sim, parece bastante estranho que você possa declará-lo final
na interface, mas não final na implementação. Teria feito mais sentido se:
uma. final
a palavra-chave não era permitida para argumentos do método de interface (abstrato) (mas você pode usá-la na implementação) ou
b. declarar um argumento como final
na interface o forçaria a ser declarado final
na implementação (mas não forçado para não finais).
Posso pensar em duas razões pelas quais uma assinatura de método pode ter final
parâmetros: Beans e Objetos (na verdade, ambos são a mesma razão, mas contextos ligeiramente 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 ");
}
A final
palavra-chave garantiu que não criaríamos acidentalmente uma nova panela local , mostrando um erro de compilação quando tentamos fazê-lo. Isso garantiu que o caldo de galinha fosse adicionado à panela original que o addChicken
método obteve. Compare isso com o local addVegetables
onde perdemos a couve-flor, porque ela foi adicionada a uma nova panela de cozinha local, em vez da panela original.
Feijão:
é o mesmo conceito que objetos (como mostrado acima) . Beans são essencialmente Object
s em Java. No entanto, os beans (JavaBeans) são usados em vários aplicativos como uma maneira conveniente de armazenar e transmitir uma coleção definida de dados relacionados. Assim como addVegetables
poderia atrapalhar o processo de criação, criando uma nova panela StringBuilder
e jogando-a fora com a couve-flor, também poderia fazer o mesmo com uma panela JavaBean .
final
de qualquer maneira, não faz nada com tipos nativos, pois eles são copiados.