Jason. Cała informatyka w jednym miejscu!

Przystępujemy do następnej części z cyklu dziedziczenia w języku Java. Jak wiemy z poprzedniej części, abstrakcja pozwala nałożyć zabezpieczenie na tworzenie zbyt ogólnych obiektów i wymusić implementacje abstrakcyjnych metod na klasach potomnych. Teraz zapoznam Was z zabezpieczaniem od drugiej strony czyli sprawienie, aby dana klasa, metoda lub zmienna była "finalną". "final" w języku Java - oto czego Wam potrzeba ;)!

"FINAL" W JĘZYKU JAVA MA INNY WPŁYW NA RÓŻNE KONSTRUKCJE

Znów trzeba podzielić materiał na parę dróg. Tym razem rozpatrujemy trzy przypadki - dla klasy, metody i zmiennej.

KLASA FINALNA

Gdy klasa jest finalna to znak, że nie można jej wykorzystać obok słowa "extends" w następnej klasie względem hierarchii dziedziczenia, czyli nie można od niej dziedziczyć. Można ograniczyć pole manewrów z obu stron. Od początku ogranicza "abstract", a "final" od końca. To również może być traktowane jako zabieg kosmetyczny, aczkolwiek dzięki tej klauzuli można sprawić, że definicja danej klasy będzie niezmienna i definitywna. Dotyczy to również zmiennych i metod, natomiast to daje różne efekty.

Wracamy do tego samego budulca: "BaseClass" i "ChildClass". Załóżmy, że teraz "ChildClass" jest klasą finalną:

public final class ChildClass {
	
}

W tym przypadku nie ma żadnych konsekwencji w kontekście klasy bazowej oraz wszystkich klas potomnych stojących "wyżej" nad "ChildClass". To jednak będzie robić różnicę w drugą stronę bowiem nie będzie można definiować nowych klas potomnych w oparciu o "ChildClass"! Cały efekt.

Klasa finalna przyda się w przypadkach, kiedy nie da się (czy nawet nie powinno) jeszcze bardziej szczegółowo określić bytu. Na ten przykład wojownik może wejść na szczegółową klasę i stać się jeźdźcem konno, a drugi z nich zostać zwinnym skrytobójcą i też nie będzie sensu drążenia dalej tych klas. Jedna i druga będzie zatem finalna.

METODA FINALNA

W języku Java, kiedy wstawimy "final" wobec metody, to zablokujemy przesłanianie jej treści w dalszych klasach potomnych. Więc gdyby jakaś klasa dziedziczyłaby od takiej, która posiada w sobie metodę finalną:

public class ChildClass {
	public final void doSomething() {
		// instrukcje
	}
}

to próba przesłaniania z adnotacją "@Override" skończyłaby się błędem.

ZMIENNA FINALNA

"final" można też odnieść do zmiennej, czyli danej składowej. Zastanawialiście się gdzie się podziało słowo kluczowe do definiowania prawdziwych stałych jak za pomocą "const"? Patrzycie właśnie na nie :D. "final" w języku Java jest jak "const" w C# - to definiuje stałą, czyli wartość trwałą i niezmienną przez cały cykl działania programu:

public class ChildClass {
	private final int CONSTANT_NUMBER = 359;
}

Używając stałych, rekomendowany jest styl pisania nazywany jako "SCREAMING_SNAKE_CASE", czyli same majuskuły (wielkie litery), a słowa separowane znakiem podkreślenia tzw. "podłogą".

Podsumowując, zmienne finalne są odpowiednikiem wartości stałych wyróżniających się w innych językach słowem "const", a gdy metoda jest finalna, to wówczas nie można jej przesłonić w następnych klasach dziedziczących. Jeżeli klasa jest finalna, to nie można jej wykorzystać do dalszego dziedziczenia. Takie występują różnice w zależności od tego, w którym miejscu wstawimy modyfikator "final" w języku Java.

Słowo kluczowe "final" w języku Java

Słowo kluczowe "final" w języku Java to znak dla kompilatora, aby w kontekście klasy, zabronił dalszego dziedziczenia. Użyte w stosunku do metody, zabroni przesłaniania w klasach potomnych. Nałożone na daną składową, symuluje stałą.


Dziękuję za uwagę :).

PODOBNE ARTYKUŁY