final (Java)

finalsłowo kluczowe w języku programowania Java, które zależnie od użytego kontekstu oznacza niezmienność deklarowanego elementu.

Zmienne finalne

Zmiennej finalnej można tylko raz przypisać wartość co z reguły ma miejsce podczas jej deklaracji. Należy zwrócić uwagę, że w przypadku zmiennej reprezentującej obiekt wartością tej zmiennej jest wartość tej referencji – nie zaś sam obiekt. Oznacza to, że oznaczenie referencji jako finalnej nie oznacza, że stan obiektu na który ta referencja wskazuje nie może zostać zmieniony, a jedynie że samej zmiennej nie można przypisać drugi raz referencji do obiektu – choćby nawet tego samego.

Przykład:

public class MyProgram {

  public static void main( String[] args ) {
    // Deklaracja zmiennej finalnej i przypisanie wartości
    final int x = 2;

    // Niepoprawne: próba ponownego przypisania wartości.
    // x = 6;

    final Sphere s;
    s = new Sphere( 1 );

    // Zmiana stanu obiektu - poprawne gdyż final nie dotyczy niezmienności stanu obiektu
    s.radius = 123;

    // Niepoprawne - próba ponownego przypisania wartości polu finalnemu w klasie Sphere:
    // s.id = 2;

    // Niepoprawne próba ponownego przypisania referencji innego obiektu zmiennej lokalnej s
    // s = new Sphere( 3 );
    }

}

class Sphere {
    public float radius;
    public final int id;
    public Sphere( int givenId ) {
        // Przypisanie wartości polu finalnemu w klasie
        this.id = givenId;
    }
}

Metody finalne

Ponieważ w Javie wszystkie metody są domyślnie wirtualne, implementacja każdej z nich może zostać podana lub zmieniona w klasach pochodnych. W celu zablokowania takiej możliwości należy metodę zadeklarować jako finalną. Oznacza to, że nie może ona zostać zaimplementowana w klasie pochodnej a jej implementacja musi zostać podana w klasie w której została zadeklarowana. Decyzja o zadeklarowaniu metody jako finalnej może być podyktowana tym aby zapobiec niespodziewanemu zachowaniu się metody w podklasach zachowując w ten sposób spójność całej klasy.

Przykład:

public class MyClass {
    public void myRegularMethod() {
        System.out.println("Jestem w myRegularMethod klasy MyClass");
    }
    public final void myFinalMethod() {
        System.out.println("Jestem w myFinalMethod klasy MyClass");
    }
}

public class MySubClass extends MyClass {
    public void myRegularMethod() {
        System.out.println("Jestem w myRegularMethod klasy MySubClass");
    }

    // Niepoprawne - nie można zaimplementować metody finalnej w podklasie:
    // public final void myFinalMethod() {
    //     System.out.println("Jestem w myFinalMethod klasy MySubClass");
    // }
}

Klasy finalne

Zadeklarowanie klasy jako finalnej oznacza, że nie może być ona dziedziczona przez inne klasy co może być podyktowane względami bezpieczeństwa lub efektywności. Wiele standardowych klas Javy jest klasami finalnymi np.: java.lang.System i java.lang.String. Wszystkie metody w klasie finalnej są automatycznie finalne.

Przykład:

// Klasa finalna:
public final class FinalPoint {
    public final int x;
    public final int y;
}

// Niepoprawne - klasa próbuje dziedziczyć po klasie finalnej:
// public class 3DPoint extends FinalPoint {
//     public final int z;
// }

Klasa 3DPoint jest błędnie zadeklarowana ponieważ próbuje dziedziczyć po klasie finalnej, co spowoduje błąd kompilacji.

Linki zewnętrzne