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 effetti diversi in ciascun caso.
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; // Può essere assegnata una sola volta nel costruttore
}
public void setRadius(double r) {
// this.radius = r; // Errore! Non è possibile riassegnare una variabile final
}
}Una variabile final deve essere inizializzata al momento della dichiarazione oppure nel costruttore. Dopodiché, qualsiasi tentativo di riassegnarla causa un errore di compilazione.
Per i tipi di 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 deve 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.
Sfida
FacileCostruiamo un sistema di registrazione degli 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 al momento della 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 il nuovo nome da assegnare. 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 seguente: 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 i dati in 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