Menu
Coddy logo textTech

Blocos Estáticos

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 17 de 87.

Às vezes, você precisa inicializar variáveis estáticas com uma lógica que é mais complexa do que uma simples atribuição. Um bloco estático (também chamado de inicializador estático) é executado uma vez quando a classe é carregada pela primeira vez, antes que qualquer objeto seja criado ou métodos estáticos sejam chamados.

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

O bloco estático executa automaticamente quando a classe é carregada na memória. Isso acontece apenas uma vez, independentemente de quantos objetos você crie. É perfeito para inicializações que exigem múltiplas instruções, cálculos ou lógica condicional.

Você pode ter múltiplos blocos estáticos em uma classe, e eles são executados na ordem em que aparecem:

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

Blocos estáticos são comumente usados para inicializar arrays ou coleções estáticas, configurar valores de configuração que exigem computação e realizar tarefas de configuração única no nível da classe.

challenge icon

Desafio

Fácil

Vamos construir um sistema GameConfig que utiliza blocos estáticos para inicializar as configurações do jogo quando a classe é carregada pela primeira vez. Isso é perfeito para configurações que precisam ser calculadas ou definidas uma única vez antes que qualquer objeto do jogo seja criado.

Você criará dois arquivos para organizar seu código:

  • GameConfig.java: Crie uma classe de configuração que inicializa suas definições usando blocos estáticos:
    • Um array estático privado levelThresholds (int[]) que armazena a pontuação necessária para atingir cada nível
    • Uma variável estática privada maxLevel (int) que armazena o número total de níveis
    • Uma variável estática privada configLoaded (boolean) para rastrear se a inicialização ocorreu
    • Use um bloco estático para inicializar maxLevel como 5 e imprimir "Initializing game configuration..."
    • Use um segundo bloco estático para criar o array levelThresholds com tamanho igual a maxLevel, depois preencha-o de forma que cada nível exija level * 100 pontos (nível 1 precisa de 100, nível 2 precisa de 200, etc.), e defina configLoaded como true
    • Um método estático getThreshold(int level) que retorna o limite de pontuação para aquele nível (os níveis são baseados em 1)
    • Um método estático getMaxLevel() que retorna o nível máximo
    • Um método estático isConfigLoaded() que retorna se a configuração foi carregada
  • Main.java: Demonstre que os blocos estáticos são executados automaticamente quando a classe é acessada. Você receberá uma entrada: um número de nível para consultar. Imprima quatro linhas:
    • Config loaded: true ou Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (sempre mostre o nível 1 também)

Você receberá uma entrada: o número do nível (int) para consultar.

Observe como a mensagem de inicialização é impressa antes de qualquer código da sua Main ser executado - esse é o bloco estático sendo executado quando a classe é carregada pela primeira vez!

Folha de consulta

Um bloco estático (ou inicializador estático) é executado uma vez quando a classe é carregada pela primeira vez, antes que qualquer objeto seja criado ou métodos estáticos sejam chamados. Ele é usado para lógica de inicialização complexa que requer múltiplas instruções.

public class Example {
    private static String value;
    
    static {
        // Lógica de inicialização
        value = "initialized";
        System.out.println("Static block executed");
    }
}

Blocos estáticos são executados automaticamente quando a classe é carregada na memória, apenas uma vez, independentemente de quantos objetos sejam criados.

Você pode ter múltiplos blocos estáticos em uma classe. Eles são executados na ordem em que aparecem:

public class Example {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

Usos comuns incluem a inicialização de arrays ou coleções estáticas, a configuração de valores de configuração que exigem computação e a execução de tarefas de configuração única no nível da classe.

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Acesse GameConfig para demonstrar a execução do bloco estático
        // Os blocos estáticos em GameConfig serão executados automaticamente quando você acessar a classe pela primeira vez
        
        // TODO: Imprima se a configuração está carregada
        // Formato: "Config loaded: true" ou "Config loaded: false"
        
        // TODO: Imprima o nível máximo
        // Formato: "Max level: [maxLevel]"
        
        // TODO: Imprima o limite (threshold) para o nível de entrada
        // Formato: "Level [level] threshold: [threshold]"
        
        // TODO: Imprima o limite (threshold) para o nível 1
        // Formato: "Level 1 threshold: [threshold]"
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos