Jak zauważono w komentarzach, niektóre z nich stają się nieistotne w Javie 8, gdzie final
może być niejawne. Tylko skutecznie zmienna końcowy może być stosowany w anonimowej klasy wewnętrznej lub lambda wyrażenia chociaż.
Zasadniczo wynika to ze sposobu, w jaki Java zarządza zamknięciami .
Kiedy tworzysz instancję anonimowej klasy wewnętrznej, wszystkie zmienne używane w tej klasie mają swoje wartości kopiowane za pomocą automatycznie generowanego konstruktora. Dzięki temu kompilator nie musi automatycznie generować różnych dodatkowych typów w celu utrzymania stanu logicznego „zmiennych lokalnych”, jak na przykład kompilator C # ... (Gdy C # przechwytuje zmienną w funkcji anonimowej, naprawdę przechwytuje zmienną - zamknięcie może zaktualizować zmienną w sposób widoczny dla głównej części metody i odwrotnie.)
Ponieważ wartość została skopiowana do instancji anonimowej klasy wewnętrznej, wyglądałoby to dziwnie, gdyby zmienna mogła zostać zmodyfikowana przez resztę metody - możesz mieć kod, który wydaje się działać z nieaktualną zmienną ( bo tak faktycznie by się działo ... pracowałbyś z kopią wykonaną w innym czasie). Podobnie, jeśli możesz wprowadzić zmiany w anonimowej klasie wewnętrznej, programiści mogą oczekiwać, że zmiany te będą widoczne w treści metody zamykającej.
Ostateczne zakończenie zmiennej usuwa wszystkie te możliwości - ponieważ wartości w ogóle nie można zmienić, nie musisz się martwić, czy takie zmiany będą widoczne. Jedynym sposobem, aby pozwolić metodzie i anonimowej klasie wewnętrznej zobaczyć się nawzajem, jest użycie zmiennego typu opisu. Może to być sama klasa zamykająca, tablica, zmienny typ opakowania ... cokolwiek takiego. Zasadniczo jest to trochę jak komunikacja między jedną metodą: zmiany dokonane w parametrach jednej metody nie są widoczne dla jej obiektu wywołującego, ale zmiany dokonane w obiektach, do których odnoszą się parametry, są widoczne.
Jeśli interesuje Cię bardziej szczegółowe porównanie między zamknięciami Java i C #, mam artykuł, który omawia to bardziej szczegółowo. W tej odpowiedzi chciałem skupić się na stronie Java :)