Jak používat Java final pro třídy, metody a proměnné
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();
}
}javaVý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 errorjavaKoneč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();
}
}javaPokud 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 finaljavaKoneč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);
}
}javaKdyž 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 errorjavaVytvoř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);
}
}javaPokud tento kód spustíte, jako výstup obdržíte následující větu:
Here is your message.java