Klíčové slovo final se v jazyce Java používá k vytvoření prvků, které nelze měnit. Tento modifikátor lze použít na třídy, metody a proměnné. Používá se zejména k prevenci chyb a úmyslnému zneužití v kódu.

Co je Java final?

Většina programovacích jazyků umožňuje libovolně upravovat a rozšiřovat existující kód. V jazyce Java je to také možné, ale existují případy, kdy je nezbytné označit určitý prvek jako neměnný. V jazyce Java to lze provést pomocí modifikátoru final. Tento modifikátor se používá k omezení přístupu ke třídě, metodě nebo proměnné. Jakmile je proměnná deklarována jako finální, její hodnotu nelze změnit. Konečná třída nemůže být rozšířena a konečná metoda nemůže být přepsána. To pomáhá chránit před zneužitím této části kódu.

Závěrečné hodiny

Pokud pro třídu použijete Java final, již ji nelze rozšířit. Tento přístup je velmi běžný a v mnoha případech se používá k zabránění odvození podtřídy. To platí pro základní datové typy, jako jsou java.lang.Math nebo java.lang.String, které jsou vždy deklarovány jako finální. I když chcete zabránit odvození podtříd hlavní třídy z jiných důvodů, nejlepším způsobem je použití Java final. V následujícím příkladu vytvoříme finální třídu a druhou třídu, která by ji teoreticky měla rozšířit. Poté následuje hlavní třída s hlavní metodou.

final class FinalClass {
	public void exampleMethod() {
		System.out.println("This is a method within the final class.");
	}
}
class AdditionalClass extends FinalClass {
	public void exampleMethod() {
		System.out.println("The method is now also available in the additional class.");
	}
}
public class Main {
	public static void main(String[] args) {
		AdditionalClass ourAdditionalClass = new AdditionalClass();
		ourAdditionalClass.exampleMethod();
	}
}
java

Výstup, který obdržíte, by měl vypadat přibližně takto:

Main.java:6: error: cannot inherit from final FinalClass
class AdditionalClass extends FinalClass
       ^
1 error
java

Konečné metody

Pokud označíte metodu jako finální, nelze ji přepsat. Tím se zajistí, že metoda v podtřídě nemůže změnit své zamýšlené chování. Chcete-li toho dosáhnout, deklarujte metodu pomocí modifikátoru Java final. Uvažujme například třídu s názvem „Emperor“, která obsahuje finální metodu s názvem „myTitle“. Jiná třída „King“, která rozšiřuje „Emperor“, se pokouší přepsat metodu „myTitle“. V hlavní metodě používáme instanci „Prince“ pro přístup k metodě. Kód vypadá následovně:

public class Emperor {
	public final void myTitle() {
		System.out.println("I am the emperor.");
	}
}
public class King extends Emperor {
	public final void myTitle() {
		System.out.println("I am the king.");
	}
}
public class Prince {
	public static void main(String[] args) {
		King myTitle = new King();
		King.myTitle();
	}
}
java

Pokud nyní použijete tento kód, zobrazí se chybová zpráva:

Main.java:9: error myTitle() in King cannot override myTitle() in Emperor public final void myTitle() {
		^
overridden method is final
java

Konečné proměnné

Java final se také používá k vytváření proměnných s hodnotami, které nelze následně změnit. To je zvláště důležité, pokud mají určité proměnné zůstat v kódu konstantní. V následujícím příkladu vytvoříme proměnnou x, která má hodnotu 5. Poté se pokusíme tuto proměnnou vložit a přiřadit jí novou hodnotu. Kód vypadá takto:

public class Main {
	final int x = 5;
public static void main(String[] args) {
	Main newValue = new Main();
	newValue.x = 10;
	System.out.println(newValue.x);
	}
}
java

Když použijeme příkaz Java System.out.println k zobrazení výsledku, zobrazí se následující chybová zpráva:

Main.java:6: error: cannot assign a value to final variable x
	newValue.x = 10;
		     ^
1 error
java

Vytvořte prázdné konečné proměnné

Proměnné musí být v Javě vždy inicializovány. Pokud však deklarujete prázdnou finální proměnnou, můžete ji inicializovat pomocí konstruktoru třídy. Takto vypadá kód:

public class Example {
	final String exampleText;
	Example() {
		exampleText = "Here is your message.";
	}
	public static void main(String[] args) {
		Example newObject = new Example();
		System.out.println(newObject.exampleText);
	}
}
java

Pokud tento kód spustíte, jako výstup obdržíte následující větu:

Here is your message.
java
Přejít do hlavního menu