final w Javie jest używane do:
Cechy i subtelności:
final zmienna musi być zainicjowana przy deklaracji lub w konstruktorze;final referencja nie pozwala na zmianę referencji, ale obiekt pod referencją można zmieniać (jeśli nie jest immutable!);final klasy (np. String, Math) jest niemożliwe;final metody, nawet jeśli klasa jest dziedziczona.final class A {} // nie można zrobić class B extends A class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // błąd: nie można nadpisać foo } final int COUNT = 10;
Czy można zmienić stan obiektu, na który wskazuje final zmienna?
Odpowiedź: Tak, jeśli to nie jest obiekt immutable. Na przykład:
final List<String> names = new ArrayList<>(); names.add("Wania"); // To jest dozwolone - zmienia się obiekt pod referencją, ale nie sama referencja names = new ArrayList<>(); // Błąd kompilacji
Historia
Historia
Historia
Pojawiło się zadanie rozszerzenia zewnętrznego API, opartego na final klasach. Z powodu nich rozszerzenie okazało się niemożliwe, trzeba było duplikować logikę i utrzymywać dwie niezależne gałęzie produktu, co skomplikowało migracje.