Menu
Coddy logo textTech

Bloques estáticos

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 17 de 87.

A veces es necesario inicializar variables estáticas con una lógica que es más compleja que una simple asignación. Un bloque estático (también llamado inicializador estático) se ejecuta una vez cuando la clase se carga por primera vez, antes de que se cree cualquier objeto o se llame a cualquier método estático.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // Lógica de inicialización compleja
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

El bloque estático se ejecuta automáticamente cuando la clase se carga en memoria. Esto sucede solo una vez, independientemente de cuántos objetos crees. Es perfecto para la inicialización que requiere múltiples sentencias, cálculos o lógica condicional.

Puedes tener múltiples bloques estáticos en una clase, y se ejecutan en el orden en que aparecen:

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;
        }
    }
}

Los bloques estáticos se utilizan comúnmente para inicializar arreglos o colecciones estáticas, establecer valores de configuración que requieren cálculos y realizar tareas de configuración de una sola vez a nivel de clase.

challenge icon

Desafío

Fácil

Construyamos un sistema GameConfig que use bloques estáticos para inicializar la configuración del juego cuando la clase se cargue por primera vez. Esto es perfecto para configuraciones que deben calcularse o prepararse una sola vez antes de crear cualquier objeto del juego.

Crearás dos archivos para organizar tu código:

  • GameConfig.java: crea una clase de configuración que inicialice sus ajustes mediante bloques estáticos:
    • Un arreglo estático privado levelThresholds (int[]) que almacena la puntuación necesaria para alcanzar cada nivel
    • Una variable estática privada maxLevel (int) que almacena el número total de niveles
    • Una variable estática privada configLoaded (boolean) para indicar si se realizó la inicialización
    • Usa un bloque estático para inicializar maxLevel en 5 e imprimir "Initializing game configuration..."
    • Usa un segundo bloque estático para crear el arreglo levelThresholds con un tamaño igual a maxLevel; después, rellénalo de modo que cada nivel requiera level * 100 puntos (el nivel 1 requiere 100, el nivel 2 requiere 200, etc.) y establece configLoaded en true
    • Un método estático getThreshold(int level) que devuelve el umbral de puntuación de ese nivel (los niveles comienzan en 1)
    • Un método estático getMaxLevel() que devuelve el nivel máximo
    • Un método estático isConfigLoaded() que devuelve si se ha cargado la configuración
  • Main.java: demuestra que los bloques estáticos se ejecutan automáticamente cuando se accede a la clase. Recibirás una entrada: un número de nivel que consultar. Imprime cuatro líneas:
    • Config loaded: true o Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (muestra siempre también el nivel 1)

Recibirás una entrada: el número de nivel (int) que consultar.

Observa cómo el mensaje de inicialización se imprime antes de que se ejecute cualquier código de tu Main: ¡ese es el bloque estático ejecutándose cuando la clase se carga por primera vez!

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Acceder a GameConfig para demostrar la ejecución del bloque estático
        // Los bloques estáticos en GameConfig se ejecutarán automáticamente cuando accedas por primera vez a la clase
        
        // TODO: Imprimir si la configuración está cargada
        // Formato: "Config loaded: true" o "Config loaded: false"
        
        // TODO: Imprimir el nivel máximo
        // Formato: "Max level: [maxLevel]"
        
        // TODO: Imprimir el umbral para el nivel de entrada
        // Formato: "Level [level] threshold: [threshold]"
        
        // TODO: Imprimir el umbral para el nivel 1
        // Formato: "Level 1 threshold: [threshold]"
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online