Sobes.tech
Junior

Millistel juhtudel saab Java-s kasutada final modifikatorit?

sobes.tech AI

Vastus AI-lt

Java final modifikaatorit saab rakendada järgmiselt:

  1. Muudetamatud muutujad:
    • Kohaliku muutujad: Nende väärtus määratakse üks kord ja pärast initsialiseerimist seda muuta ei saa.
    • Klassi väljad: Välja väärtus määratakse kas deklaratsiooni ajal või konstruktoris ning seda ei saa hiljem muuta.
    • Meetodi parameetrid: Meetodi sees muutub parameeter konstantseks; seda ei saa meetodi kehas ümber määrata.

final kasutamine muutujatele tagab:

  • Muutumatuse: Garantii, et väärtus ei muutu.
  • Töötluse turvalisus: final klassi väli on automaatselt nähtav kõigile voogudele pärast konstruktorit ilma täiendava sünkroniseerimiseta.
  • Kompilaatori optimeerimised: Kompilaator võib teha teatud optimeerimisi, teades, et väärtus ei muutu.
  1. Meetodid:

    • Meetod, mis on märgitud final, ei saa olla alampunktides üle kirjutatud.
    • See on kasulik:
      • Vältida soovimatuid muudatusi: Garantii, et meetodi loogika jääb muutumatuks.
      • Toetada koostamist: Toetab koostise kasutamist pärimise asemel.
      • Kompilaatori optimeerimised: final meetodid võivad olla inline.
  2. Klassid:

    • final klassi ei saa pärida:
    • Kasutamine:
      • Muutumatute (immutable) klasside loomine: Näiteks primitiivide pakendiklassid (Integer, String).
      • Disaini kaitse: Vältida laiendamist, mis võib rikkuda klassi invariandid.
      • Turvalisuse tõstmine: Garantii, et klassi käitumist ei saa muuta pärimise kaudu.
Kasutamine Kirjeldus Eelisid
final väli Väärtus määratakse üks kord (deklaratsiooni või konstruktoriga). Muutumatuse, turvalisuse, optimeerimiste garantii
final parameeter Väärtus ei muutu meetodi sees. Selge signatuur, väärtuse muutmatus garantii
final meetod Ei saa olla alampunktides üle kirjutatud. Muutuste vältimine, koostise toetamine, optimeerimised
final klass Ei saa pärida. Muutumatuse klass, disaini kaitse, turvalisuse tõstmine

Näited:

public class Example {
    // final väli
    private final String name;

    // final primitiivne väli
    private final int id;

    // final, kuid võib olla viide erinevatele objektidele List, kuni see pole loodud
    // pärast objekti loomist, viidet saab muuta, kuid teise Listi viidet mitte
    private final List<String> items;

    // Kompilatsiooni ajalise konstant
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // `final` väli väärtuse määramine
        this.id = id; // `final` väli väärtuse määramine
        this.items = new ArrayList<>(); // `final` väli nimekirja initsialiseerimine
    }

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

    // meetod `final` parameetriga
    public void addItem(final String item) {
        // item = "uus element"; // viga kompilatsioonis: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final klass
// 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 { // viga: Cannot inherit from final class
// }