Mise à jour: La réponse originale ci-dessous a été rédigée sans bien comprendre la question, et ne répond donc pas directement à la question. :)
Néanmoins, elle doit être informative pour ceux qui cherchent à comprendre l'utilisation générale du final
mot - clé.
Pour ce qui est de la question, je voudrais citer mon propre commentaire ci-dessous.
Je pense que vous n'êtes pas obligé de mettre en œuvre la finalité d'un argument pour vous laisser libre de décider s'il doit être définitif ou non dans votre propre mise en œuvre.
Mais oui, cela semble assez étrange que vous puissiez le déclarer final
dans l'interface, mais que ce soit non final dans l'implémentation. Cela aurait été plus logique si:
une. final
Le mot clé n'était pas autorisé pour les arguments de méthode d'interface (abstraite) (mais vous pouvez l'utiliser dans l'implémentation), ou
b. déclarer un argument comme final
dans interface le forcerait à être déclaré final
dans l'implémentation (mais pas forcé pour les non finales).
Je peux penser à deux raisons pour lesquelles une signature de méthode peut avoir des final
paramètres: Beans et Objects (en fait, ce sont tous les deux la même raison, mais des contextes légèrement différents. )
Objets:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
cookingPot.append("ChickenBroth ");
}
Le final
mot-clé garantit que nous ne créerons pas accidentellement une nouvelle marmite locale en affichant une erreur de compilation lorsque nous avons tenté de le faire. Cela garantit que le bouillon de poulet est ajouté à notre marmite d'origine que la addChicken
méthode a obtenue. Comparez cela à l' addVegetables
endroit où nous avons perdu le chou-fleur parce qu'il l'a ajouté à une nouvelle marmite locale au lieu de la marmite d'origine.
Beans:
C'est le même concept que les objets (comme indiqué ci-dessus) . Les beans sont essentiellement des Object
s en Java. Cependant, les beans (JavaBeans) sont utilisés dans diverses applications comme un moyen pratique de stocker et de transmettre une collection définie de données associées. Tout comme le addVegetables
pourrait gâcher le processus de cuisson en créant une nouvelle marmite StringBuilder
et en le jetant avec le chou-fleur, il pourrait également faire de même avec une marmite JavaBean .
final
ne fait rien avec les types natifs de toute façon, puisqu'ils sont copiés.