Ako používať Java final pre triedy, metódy a premenné
Kľúčové slovo final sa v jazyku Java používa na vytvorenie prvkov, ktoré nemožno meniť. Tento modifikátor môžete použiť na triedy, metódy a premenné. Používa sa najmä na prevenciu chýb a úmyselného zneužitia v kóde.
Čo je Java final?
Väčšina programovacích jazykov umožňuje existujúci kód podľa potreby upravovať a rozširovať. V jazyku Java je to tiež možné, ale existujú prípady, keď je nevyhnutné, aby bol určitý prvok označený ako nemenný. V jazyku Java to môžete urobiť pomocou modifikátora final. Tento modifikátor sa používa na obmedzenie prístupu k triede, metóde alebo premennej. Akonáhle je premenná deklarovaná ako konečná, jej hodnotu nie je možné zmeniť. Konečná trieda nemôže byť rozšírená a konečná metóda nemôže byť prepisovaná. To pomáha chrániť pred zneužitím tejto časti kódu.
Záverečné hodiny
Ak pre triedu použijete Java final, už ju nebude možné rozšíriť. Tento prístup je veľmi bežný a v mnohých prípadoch sa používa na zabránenie odvodeniu podtriedy. To platí pre základné datové typy, ako sú java.lang.Math alebo java.lang.String, ktoré sú vždy deklarované ako konečné. Aj keď chcete zabrániť odvodeniu podtried hlavnej triedy z iných dôvodov, najlepším spôsobom je použitie Java final. V nasledujúcom príklade vytvoríme konečnú triedu a druhú triedu, ktorá by ju mala teoreticky rozšíriť. Potom nasleduje hlavná trieda s hlavnou metódou.
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ýsledok by mal vyzerať približne takto:
Main.java:6: error: cannot inherit from final FinalClass
class AdditionalClass extends FinalClass
^
1 errorjavaKonečné metódy
Ak označíte metódu ako finálnu, nemožno ju prepisovať. Tým sa zabezpečí, že metóda v podtrieda nemôže zmeniť svoje zamýšľané správanie. Na dosiahnutie tohto cieľa deklarujte metódu pomocou modifikátora Java final. Napríklad vezmime triedu s názvom „Emperor“, ktorá obsahuje finálnu metódu s názvom „myTitle“. Iná trieda „King“, ktorá rozširuje triedu „Emperor“, sa pokúša prepisovať metódu „myTitle“. V hlavnej metóde používame inštanciu „Prince“ na prístup k metóde. Kód vyzerá takto:
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();
}
}javaAk teraz použijete tento kód, zobrazí sa vám chybová správa:
Main.java:9: error myTitle() in King cannot override myTitle() in Emperor public final void myTitle() {
^
overridden method is finaljavaKonečné premenné
Java final sa používa aj na vytváranie premenných s hodnotami, ktoré nemožno následne zmeniť. To je dôležité najmä v prípade, ak určité premenné majú zostať v kóde konštantné. V nasledujúcom príklade vytvoríme premennú x, ktorá má hodnotu 5. Potom sa pokúsime vložiť túto premennú a priradiť jej novú hodnotu. Kód vyzerá 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);
}
}javaKeď použijeme príkaz Java System.out.println na zobrazenie výsledku, dostaneme nasledujúcu chybovú správu:
Main.java:6: error: cannot assign a value to final variable x
newValue.x = 10;
^
1 errorjavaVytvor prázdne konečné premenné
Premenné musia byť v Jave vždy inicializované. Ak však deklarujete prázdnu konečnú premennú, môžete ju inicializovať pomocou konštruktora triedy. Takto vyzerá 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);
}
}javaAk spustíte tento kód, ako výstup dostanete nasledujúcu vetu:
Here is your message.java