Sobes.tech
Junior

Milyen esetekben alkalmazható a final módosító Java-ban?

sobes.tech MI

Válasz az MI-től

A Java-ban a final módosítót a következő helyeken lehet alkalmazni:

  1. Változók:

    • Helyi változók: Értéküket egyszer adják meg, és az inicializálás után nem módosíthatók.
    • Osztálymezők: Az értéküket deklarációkor vagy a konstruktorban adják meg, és ezután nem módosíthatók.
    • Metódusparaméterek: Egy metóduson belüli paraméter állandóvá válik; nem lehet újra hozzárendelni a metóduson belül.

    A final változók alkalmazása biztosítja:

    • Állandóság: Garancia arra, hogy az érték nem fog változni.
    • Szálbiztonság: A final osztálymezők automatikusan láthatók minden szál számára a konstruktor befejezése után szinkronizáció nélkül.
    • Fordító optimalizációk: A fordító bizonyos optimalizációkat végezhet, mivel az érték nem fog változni.
  2. Metódusok:

    • Egy final-ként deklarált metódus nem írható felül alosztályokban.
    • Ez hasznos a következők miatt:
      • Váratlan viselkedésváltozások megelőzése: Biztosítja, hogy a metódus logikája változatlan maradjon.
      • Összetétel ösztönzése: Azt ösztönzi, hogy összetételt használjunk az öröklés helyett.
      • Fordító optimalizációk: A fordító inline-olhatja a final metódusokat.
  3. Osztályok:

    • Egy final-ként deklarált osztály nem öröklődhet.
    • A final osztály alkalmazása a következőkre szolgál:
      • Állandó (immutable) osztályok létrehozása: Például primitív típusokat csomagoló osztályok (Integer, String).
      • Tervezés védelme: Megakadályozza az osztály kiterjesztését, ami megsértheti az invariánsokat.
      • Biztonság növelése: Biztosítja, hogy az osztály viselkedése nem változtatható meg alosztályok létrehozásával.
Alkalmazás Leírás Előnyök
final mező Az érték egyszer van hozzárendelve (deklarációkor vagy a konstruktorban). Állandóság, szálbiztonság, optimalizációk.
final paraméter Az érték nem módosítható a metóduson belül. Egyértelmű szignatúra, garancia az érték állandóságára.
final metódus Nem írható felül alosztályokban. Viselkedés változásának megelőzése, összetétel ösztönzése, optimalizációk.
final osztály Nem öröklődhet (nem örökölhető). Állandó osztály, tervezés védelme, biztonság növelése.

Példák:

public class Example {
    // final mező
    private final String name;

    // final primitív mező
    private final int id;

    // final, de hivatkozhat különböző List objektumokra
    private final List<String> items;

    // Fordítási időben állandó
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // final mező értékadása
        this.id = id; // final mező értékadása
        this.items = new ArrayList<>(); // final lista mező inicializálása
    }

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

    // final paraméterű metódus
    public void addItem(final String item) {
        // item = "új elem"; // fordítási hiba: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final osztály
// 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 { // fordítási hiba: Cannot inherit from final class
// }