Junior
Kādās situācijās var izmantot final modifikatoru Java?
sobes.tech AI
Atbilde no AI
Java final modifikatoru var izmantot šādi:
- 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:
finalklases 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.
-
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:
finalmetodes var tikt inline.
- Metode, kas ir atzīmēta ar
-
Klasēm:
- Klasē, kas ir atzīmēta ar
final, nevar tikt izveidotas apakšklases. finalklases 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.
- Klasē, kas ir atzīmēta ar
| 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
// }