Aktualizacja: Oryginalna odpowiedź poniżej została napisana bez pełnego zrozumienia pytania, dlatego też nie odnosi się bezpośrednio do pytania. :)
Niemniej jednak musi być pouczająca dla osób, które chcą zrozumieć ogólne użycie final
słowa kluczowego.
Jeśli chodzi o pytanie, chciałbym zacytować swój komentarz od dołu.
Uważam, że nie jesteś zmuszony wdrożyć ostateczności argumentu, abyś mógł zdecydować, czy powinien on być ostateczny, czy nie we własnej implementacji.
Ale tak, to brzmi dość dziwnie, że można zadeklarować to final
w interfejsie, ale nie jest to ostateczne wdrożenie. Byłoby bardziej sensowne, gdyby:
za. final
słowo kluczowe nie było dozwolone dla argumentów metody interfejsu (abstrakcyjnej) (ale można go użyć w implementacji), lub
b. zadeklarowanie argumentu jako final
interfejsu zmusiłoby go do zadeklarowania go final
w implementacji (ale nie do wymuszenia w przypadku niefinałów).
Mogę wymyślić dwa powody, dla których podpis metody może mieć final
parametry: Beans i Objects (w rzeczywistości oba są z tego samego powodu, ale nieco inne konteksty ).
Obiekty:
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 ");
}
final
Kluczowe zapewnić, że nie będzie przypadkowo utworzyć nową lokalną garnek do gotowania, pokazując błąd kompilacji, gdy staraliśmy się zrobić. Dzięki temu bulion z kurczaka został dodany do naszego oryginalnego garnka do gotowania, który addChicken
otrzymaliśmy według metody. Porównaj to z addVegetables
miejscem, w którym straciliśmy kalafior, ponieważ dodało to do nowego lokalnego garnka do gotowania zamiast oryginalnego garnka, który dostał.
Fasola:
Jest to ta sama koncepcja co obiekty (jak pokazano powyżej) . Ziarna są zasadniczo Object
w Javie. Jednak fasole (JavaBeans) są używane w różnych aplikacjach jako wygodny sposób przechowywania i przekazywania określonej kolekcji powiązanych danych. Podobnie jak addVegetables
może to zepsuć proces gotowania, tworząc nowy garnek do gotowania StringBuilder
i wyrzucając go z kalafiorem, tak samo może zrobić to samo z garnkiem JavaBean .
final
i tak nie robi nic z rodzimymi typami, ponieważ są one kopiowane.