final

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

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

Zmienne finalne[edytuj | edytuj kod]

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śi
    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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]