Junior
Millistel juhtudel saab Java-s kasutada final modifikatorit?
sobes.tech AI
Vastus AI-lt
Java final modifikaatorit saab rakendada järgmiselt:
- 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:
finalklassi 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.
-
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:
finalmeetodid võivad olla inline.
- Meetod, mis on märgitud
-
Klassid:
finalklassi 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
// }