final (Java)
final – sł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ś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
[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.