Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Creiamo 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 maxLevel a 5 e stampare "Initializing game configuration..."
    • Usa un secondo blocco statico per creare l'array levelThresholds con dimensione uguale a maxLevel, poi compilalo in modo che ogni livello richieda level * 100 punti (il livello 1 ne richiede 100, il livello 2 ne richiede 200, ecc.) e imposta configLoaded su true
    • 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
  • 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: true oppure Config loaded: false
    • Max 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]"
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Java online