Blocchi statici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 17 di 87.
A volte devi inizializzare variabili statiche con una logica più complessa di una semplice assegnazione. Un blocco statico (chiamato anche inizializzatore statico) viene eseguito una volta quando la classe viene caricata per la prima volta, prima che vengano creati oggetti o chiamati metodi statici.
public class DatabaseConfig {
private static String connectionString;
private static int maxConnections;
static {
// Logica di inizializzazione complessa
connectionString = "jdbc:mysql://localhost:3306/mydb";
maxConnections = 10;
System.out.println("Database configuration loaded");
}
}Il blocco statico viene eseguito automaticamente quando la classe viene caricata in memoria. Questo accade una sola volta, indipendentemente da quanti oggetti crei. È perfetto per l'inizializzazione che richiede più istruzioni, calcoli o logica condizionale.
Puoi avere più blocchi statici in una classe, che vengono eseguiti nell'ordine in cui compaiono:
public class AppSettings {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}I blocchi statici vengono comunemente utilizzati per inizializzare array o raccolte statiche, impostare valori di configurazione che richiedono calcoli ed eseguire attività di configurazione una tantum a livello di classe.
Sfida
FacileCreiamo un sistema GameConfig che utilizza blocchi statici per inizializzare le impostazioni del gioco quando la classe viene caricata per la prima volta. È perfetto per le configurazioni che devono essere calcolate o impostate una sola volta, prima che vengano creati oggetti di gioco.
Creerai due file per organizzare il codice:
GameConfig.java: crea una classe di configurazione che inizializza le proprie impostazioni usando blocchi statici:- Un array statico privato
levelThresholds(int[]) che memorizza il punteggio necessario per raggiungere ciascun livello - Una variabile statica privata
maxLevel(int) che memorizza il numero totale di livelli - Una variabile statica privata
configLoaded(boolean) per tenere traccia del fatto che l'inizializzazione sia avvenuta - Usa un blocco statico per inizializzare
maxLevela 5 e stampare"Initializing game configuration..." - Usa un secondo blocco statico per creare l'array
levelThresholdscon dimensione uguale amaxLevel, poi compilalo in modo che ogni livello richiedalevel * 100punti (il livello 1 ne richiede 100, il livello 2 ne richiede 200, ecc.) e impostaconfigLoadedsutrue - Un metodo statico
getThreshold(int level)che restituisce la soglia di punteggio per quel livello (i livelli partono da 1) - Un metodo statico
getMaxLevel()che restituisce il livello massimo - Un metodo statico
isConfigLoaded()che restituisce se la configurazione è stata caricata
- Un array statico privato
Main.java: dimostra che i blocchi statici vengono eseguiti automaticamente quando si accede alla classe. Riceverai un input: un numero di livello da interrogare. Stampa quattro righe:Config loaded: trueoppureConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](mostra sempre anche il livello 1)
Riceverai un input: il numero del livello (int) da interrogare.
Nota come il messaggio di inizializzazione venga stampato prima che venga eseguito qualsiasi codice di Main: è il blocco statico che viene eseguito quando la classe viene caricata per la prima volta!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Accedi a GameConfig per mostrare l'esecuzione dei blocchi statici
// I blocchi statici di GameConfig verranno eseguiti automaticamente al primo accesso alla classe
// TODO: Stampa se la configurazione è stata caricata
// Formato: "Config loaded: true" oppure "Config loaded: false"
// TODO: Stampa il livello massimo
// Formato: "Max level: [maxLevel]"
// TODO: Stampa la soglia per il livello inserito
// Formato: "Level [level] threshold: [threshold]"
// TODO: Stampa la soglia per il livello 1
// Formato: "Level 1 threshold: [threshold]"
}
}
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