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 criar um sistema GameConfig que usa 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 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 configurações usando blocos estáticos:
    • Um array estático privado levelThresholds (int[]) que armazena a pontuação necessária para alcançar 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 verificar se a inicialização ocorreu
    • Use um bloco estático para inicializar maxLevel com 5 e imprimir "Initializing game configuration..."
    • Use um segundo bloco estático para criar o array levelThresholds com tamanho igual a maxLevel, depois preenchê-lo para que cada nível exija level * 100 pontos (o nível 1 precisa de 100, o nível 2 precisa de 200, etc.) e definir configLoaded como true
    • Um método estático getThreshold(int level) que retorna o limite de pontuação para esse nível (os níveis começam 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 também o nível 1)

Você receberá uma entrada: o número do nível (int) a ser consultado.

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

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

Pratique por conta própria: Compilador de Java online