Sobes.tech
Junior

V ktorých prípadoch možno použiť modifikátor final v Jave?

sobes.tech AI

Odpoveď od AI

Modifikátor final v Jave možno použiť na:

  1. Premenné:
    • Lokálne premenné: Ich hodnota je priradená raz a nemôže byť zmenená po inicializácii.
    • Polia triedy: Hodnota poľa je priradená buď pri deklarácii, alebo v konštruktore a potom nemôže byť zmenená.
    • Parametre metódy: Parameter vo vnútri metódy sa stáva konštantou; nemôže byť prepísaný v tele metódy.

Použitie final na premenné zabezpečuje:

  • Nemennosť: Záruka, že hodnota sa nezmení.
  • Bezpečnosť vlákien: final pole triedy je automaticky viditeľné všetkým vláknam po ukončení konštruktora bez ďalšej synchronizácie.
  • Optimalizácie kompilátora: Kompilátor môže vykonávať niektoré optimalizácie s vedomím, že hodnota sa nezmení.
  1. Metódam:

    • Metóda označená ako final nemôže byť prepísaná v podtriedach.
    • To je užitočné pre:
      • Prevenciu nechcených zmien správania: Zaručuje, že logika metódy zostane nezmenená.
      • Podporu kompozície: Podporuje použitie kompozície namiesto dedičnosti.
      • Možné optimalizácie kompilátora: Kompilátor môže vykonávať inline rozbaľovanie volaní final metód.
  2. Triedam:

    • Trieda označená ako final nemôže mať podtriedy.
    • Použitie final na triedu je určené pre:
      • Vytváranie nemenných (immutable) tried: Napríklad obalové triedy primitívov (Integer, String).
      • Ochranu dizajnu: Zabraňuje rozšíreniu, ktoré by mohlo narušiť invarianty triedy.
      • Zvýšenie bezpečnosti: Zaručuje, že správanie triedy nemôže byť zmenené vytvorením podtried.
Použitie Popis Výhody
final pole Hodnota je priradená raz (pri deklarácii alebo v konštruktore). Nemennosť, bezpečnosť vlákien, optimalizácie.
final parameter Hodnota nemôže byť zmenená vnútri metódy. Jasná signatúra, záruka nemennosti hodnoty parametra.
final metóda Nemôže byť prepísaná v podtriedach. Prevencia zmeny správania, podpora kompozície, optimalizácie.
final trieda Nemôže mať podtriedy (nedá sa dediť). Nemennosť triedy, ochrana dizajnu, zvýšenie bezpečnosti.

Príklady:

public class Example {
    // final pole triedy
    private final String name;

    // final primitívne pole
    private final int id;

    // final, ale môže byť odkaz na rôzne objekty List, kým nebude vytvorený
    // po vytvorení objektu List je možné meniť, ale nie je možné prepísať odkaz na iný List
    private final List<String> items;

    // Konštanta času kompilácie
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // Priradenie final poľu name
        this.id = id;     // Priradenie final poľu id
        this.items = new ArrayList<>(); // Inicializácia final poľa zoznamu
    }

    // final metóda
    public final void printDetails() {
        System.out.println("Name: " + name + ", ID: " + id);
    }

    // Metóda s final parametrom
    public void addItem(final String item) {
        // item = "nový prvok"; // Chyba kompilácie: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final trieda
// public final class ImmutableClass {
//     private final int value;
//
//     public ImmutableClass(int value) {
//         this.value = value;
//     }
//
//     public int getValue() {
//         return value;
//     }
// }

// public class SubclassOfImmutable extends ImmutableClass { // Chyba kompilácie: Cannot inherit from final class
// }