Sobes.tech
Junior

Kādās situācijās var izmantot final modifikatoru Java?

sobes.tech AI

Atbilde no AI

Java final modifikatoru var izmantot šādi:

  1. Mainīgie:
    • Lokālie mainīgie: To vērtība tiek piešķirta vienreiz un pēc inicializācijas vairs nevar tikt mainīta.
    • Klases lauki: Lauka vērtība tiek piešķirta vai nu deklarācijas laikā, vai konstruktorā, un pēc tam vairs nevar tikt mainīta.
    • Metodes parametri: Metodes iekšienē parametrs kļūst par konstanti; to nevar pārrakstīt metodes ķermenī.

final izmantošana mainīgajiem nodrošina:

  • Nemainīgumu: Garantē, ka vērtība nemainīsies.
  • Vīrusu drošību: final klases lauks automātiski ir redzams visiem pavedieniem pēc konstruktora pabeigšanas bez papildu sinhronizācijas.
  • Kompilētāja optimizācijas: Kompilators var veikt dažas optimizācijas, zinot, ka vērtība nemainīsies.
  1. Metodes:

    • Metode, kas ir atzīmēta ar final, nevar tikt pārrakstīta apakšklasēs.
    • Tas ir noderīgi, lai:
      • Novērstu nevēlamas izmaiņas: Garantē, ka metodes loģika paliks nemainīga.
      • Veicinātu kompozīciju: Veicina kompozīcijas izmantošanu vietā mantošanai.
      • Kompilētāja optimizācijas: final metodes var tikt inline.
  2. Klasēm:

    • Klasē, kas ir atzīmēta ar final, nevar tikt izveidotas apakšklases.
    • final klases izmantošana:
      • Nemainīgu (immutable) klasu izveide: Piemēram, primitīvu apvalka klases (Integer, String).
      • Dizaina aizsardzība: Novērš paplašināšanu, kas varētu pārkāpt klases invarianti.
      • Drošības uzlabošana: Garantē, ka klases uzvedība nevar tikt mainīta ar mantošanu.
Izmantošana Apraksts Priekšrocības
final lauks Vērtība tiek piešķirta vienreiz (deklarējot vai konstruktorā). Nemainīgums, drošība, optimizācijas
final parametra Vērtība netiek mainīta metodes iekšienē. Skaidra signatūra, garantija par vērtības nemainību
final metode Nav pārrakstāma apakšklasēs. Novērš izmaiņas, veicina kompozīciju, optimizācijas
final klase Nav mantošanas iespēju. Nemainīga klase, dizaina aizsardzība, drošības uzlabošana

Piemēri:

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

    // final primitīvs lauks
    private final int id;

    // final, bet var būt atsauce uz dažādiem objektiem List, kamēr tas nav izveidots
    // pēc objekta izveides, atsauci var mainīt, bet ne pārrakstīt citam List
    private final List<String> items;

    // Kompilācijas laika konstante
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // `final` lauka piešķiršana
        this.id = id; // `final` lauka piešķiršana
        this.items = new ArrayList<>(); // `final` lauka saraksta inicializācija
    }

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

    // metode ar `final` parametru
    public void addItem(final String item) {
        // item = "jauns elements"; // kļūda kompilācijā: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final klase
// 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 { // kļūda: Cannot inherit from final class
// }