Junior
Kokiose situacijose galima naudoti final modifikatorių Java?
sobes.tech AI
Atsakymas iš AI
Java final modifikatorius galima taikyti:
- 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ą:
finalklasė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.
-
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:
finalmetodai gali būti inlininti.
- Metodas, pažymėtas kaip
-
Klasėms:
- Klasė, pažymėta kaip
final, negali būti paveldima. finalklasė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.
- Klasė, pažymėta kaip
| 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
// }