Update: Die ursprüngliche Antwort unten wurde geschrieben, ohne die Frage vollständig zu verstehen, und geht daher nicht direkt auf die Frage ein. :)
Dennoch muss sie für diejenigen informativ sein, die die allgemeine Verwendung von verstehen möchtenfinal
Schlüsselwörtern möchten.
Zu der Frage möchte ich meinen eigenen Kommentar von unten zitieren.
Ich glaube, Sie sind nicht gezwungen, die Endgültigkeit eines Arguments umzusetzen, damit Sie frei entscheiden können, ob es in Ihrer eigenen Umsetzung endgültig sein soll oder nicht.
Aber ja, es klingt ziemlich seltsam, dass Sie es final
in der Schnittstelle deklarieren können, es aber in der Implementierung nicht endgültig haben . Es wäre sinnvoller gewesen, wenn entweder:
ein. final
Das Schlüsselwort war für Argumente der Schnittstellenmethode (abstrakt) nicht zulässig (Sie können es jedoch in der Implementierung verwenden), oder
b. Das Deklarieren eines Arguments wie final
in der Schnittstelle würde die Deklaration final
in der Implementierung erzwingen (jedoch nicht für Nicht-Finale erzwingen ).
Ich kann mir zwei Gründe vorstellen, warum eine Methodensignatur final
Parameter haben kann: Beans und Objekte ( Eigentlich sind beide der gleiche Grund, aber leicht unterschiedliche Kontexte. )
Objekte:
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 ");
}
Das final
Schlüsselwort stellte sicher, dass wir nicht versehentlich einen neuen lokalen Kochtopf erstellen, indem bei diesem Versuch ein Kompilierungsfehler angezeigt wurde. Dies stellte sicher, dass die Hühnerbrühe in unseren ursprünglichen Kochtopf gegeben wurde, den die addChicken
Methode erhielt. Vergleichen Sie dies mit der Stelle, addVegetables
an der wir den Blumenkohl verloren haben, weil er diesen anstelle des ursprünglichen Topfes in einen neuen lokalen Kochtopf gegeben hat.
Bohnen:
Es ist das gleiche Konzept wie bei Objekten (wie oben gezeigt) . Bohnen sind im Wesentlichen Object
s in Java. Beans (JavaBeans) werden jedoch in verschiedenen Anwendungen verwendet, um eine definierte Sammlung verwandter Daten bequem zu speichern und weiterzugeben. So wie das addVegetables
den Kochprozess durcheinander bringen könnte, indem ein neuer Kochtopf erstellt StringBuilder
und mit dem Blumenkohl weggeworfen wird, könnte dies auch mit einem Kochtopf JavaBean geschehen .
final
macht sowieso nichts mit nativen Typen, da sie kopiert werden.