La parola chiave final
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 13 di 87.
La parola chiave final in Java impedisce le modifiche. Può essere applicata a variabili, metodi e classi, con un effetto diverso per ciascuno.
Quando viene applicato a una variabile, final la rende una costante: una volta assegnato, il suo valore non può cambiare:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Si può assegnare una sola volta nel costruttore
}
public void setRadius(double r) {
// this.radius = r; // Errore! Non si può riassegnare una variabile final
}
}Una variabile final deve essere inizializzata al momento della dichiarazione oppure nel costruttore. Dopodiché, ogni tentativo di riassegnarla causa un errore di compilazione.
Per i tipi riferimento, final significa che il riferimento non può puntare a un oggetto diverso, ma il contenuto dell'oggetto può comunque cambiare:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Errore! Non si può riassegnare
name.append(" Doe"); // OK! Il contenuto dell'oggetto può cambiareUsare final con i campi comunica chiaramente l'intento: indica agli altri sviluppatori che questo valore non dovrebbe mai cambiare dopo l'inizializzazione. È particolarmente utile per i valori di configurazione, gli ID o qualsiasi dato che deve rimanere costante per tutta la durata di vita di un oggetto.
Un final metodo non può essere sovrascritto in una sottoclasse:
class Base {
public final void greet() {
System.out.println("Hi");
}
}
class Child extends Base {
// public void greet() { } // Errore! greet() è final in Base
}Una final classe non può essere estesa in alcun modo. String è una classe final, quindi nessuna classe può estenderla:
final class Config { }
// class MyConfig extends Config { } // Errore! Config è finalSfida
FacileCostruiamo un sistema di registrazione degli studenti Student che usa la parola chiave final per proteggere i dati che non dovrebbero mai cambiare dopo la registrazione di uno studente.
Creerai due file per organizzare il codice:
Student.java: crea una classe Student in cui alcune informazioni vengono bloccate in modo permanente una volta impostate:- Un campo
finalstudentId(String) - assegnato alla creazione e che non può mai cambiare - Un campo
finalenrollmentYear(int) - l'anno in cui lo studente si è iscritto, anch'esso permanente - Un normale campo privato
name(String) - può essere aggiornato se lo studente cambia nome - Un costruttore che accetta tutti e tre i valori e inizializza i campi
- Un getter
getStudentId()per l'ID dello studente - Un getter
getEnrollmentYear()per l'anno di iscrizione - Un getter
getName()e un settersetName()per il nome - Un metodo
getInfo()che restituisce:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Un campo
Main.java: crea un oggetto Student, poi aggiorna il suo nome e visualizza le sue informazioni. Riceverai quattro input: l'ID dello studente, il nome iniziale, l'anno di iscrizione e un nuovo nome da impostare. Stampa due righe:- Le informazioni dello studente prima del cambio di nome
- Le informazioni dello studente dopo il cambio di nome
Riceverai quattro input, nell'ordine: studentId (String), name (String), enrollmentYear (int) e newName (String).
Nota come i campi final proteggono l'ID dello studente e l'anno di iscrizione: sono dati permanenti che non dovrebbero cambiare, mentre il nome può essere aggiornato tramite il relativo setter.
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int enrollmentYear = scanner.nextInt();
scanner.nextLine(); // consuma il carattere di nuova riga
String newName = scanner.nextLine();
// TODO: Crea un oggetto Student con i valori iniziali
// TODO: Stampa le informazioni dello studente prima della modifica del nome
// TODO: Aggiorna il nome dello studente usando il setter
// TODO: Stampa le informazioni dello studente dopo la modifica del nome
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online