Sobes.tech
Junior

Kokiose situacijose galima naudoti final modifikatorių Java?

sobes.tech AI

Atsakymas iš AI

Java final modifikatorius galima taikyti:

  1. Kintamiesiems:
    • Vietiniams kintamiesiems: Jų reikšmė yra priskiriama vieną kartą ir po inicializacijos negali būti keičiama.
    • Klasės laukai: Lauko reikšmė yra priskiriama arba deklaracijos metu, arba konstruktoriuje, ir vėliau negali būti keičiama.
    • Metodo parametrai: Metodo viduje parametras tampa konstantu; jo negalima perrašyti metodo kūne.

final taikymas kintamiesiems užtikrina:

  • Nepriklausomybę nuo pakeitimų: Garantija, kad reikšmė nesikeis.
  • Sriegių saugumą: final klasės laukas automatiškai matomas visiems srautams po konstruktoriaus pabaigos be papildomos sinchronizacijos.
  • Kompiliatoriaus optimizacijas: Kompiliatorius gali atlikti tam tikras optimizacijas, žinodamas, kad reikšmė nesikeis.
  1. Metodams:

    • Metodas, pažymėtas kaip final, negali būti perrašytas pogrupiuose.
    • Tai naudinga siekiant:
      • Prevencijos nuo nenorimų pakeitimų: Garantija, kad metodo logika liks nepakitusi.
      • Kompozicijos skatinimo: Skatina naudoti kompoziciją vietoje paveldėjimo.
      • Kompiliatoriaus optimizacijas: final metodai gali būti inlininti.
  2. Klasėms:

    • Klasė, pažymėta kaip final, negali būti paveldima.
    • final klasės taikymas:
      • Nepriklausomų (immutable) klasių kūrimas: Pvz., primityvų apvalkalo klasės (Integer, String).
      • Dizaino apsauga: Užkerta kelią plėtimui, kuris gali pažeisti klasės invariantus.
      • Saugumo didinimas: Garantija, kad klasės elgsena negali būti pakeista paveldėjimu.
Taikymas Aprašymas Privalumai
final laukas Reikšmė priskiriama vieną kartą (deklaruojant arba konstruktoriuje). Nepriklausomybė, saugumas, optimizacijos
final parametras Reikšmė negali būti keičiama metodo viduje. Aiški signatūra, garantija dėl reikšmės nekeitimo
final metodas Negali būti perrašytas pogrupiuose. Pakeitimų prevencija, skatinimas naudoti kompoziciją, optimizacijos
final klasė Negali būti paveldima. Nepriklausomybė, dizaino apsauga, saugumo didinimas

Pavyzdžiai:

public class Example {
    // final laukas
    private final String name;

    // final primityvus laukas
    private final int id;

    // final, bet gali būti nuoroda į skirtingus objektus List, kol nėra sukurtas
    // po objekto sukūrimo, nuorodą keisti galima, bet kitą List keisti ne
    private final List<String> items;

    // Kompiliatoriaus laiko konstanta
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // priskyrimas final laukui
        this.id = id; // priskyrimas final laukui
        this.items = new ArrayList<>(); // final lauko sąrašo inicializavimas
    }

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

    // metodas su final parametru
    public void addItem(final String item) {
        // item = "naujas elementas"; // klaida kompilacijoje: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final klasė
// 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 { // klaida: Cannot inherit from final class
// }