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.
Desafio
FácilVamos 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
maxLevelcomo 5 e imprimir"Initializing game configuration..." - Use um segundo bloco estático para criar o array
levelThresholdscom tamanho igual amaxLevel, depois preencha-o de forma que cada nível exijalevel * 100pontos (nível 1 precisa de 100, nível 2 precisa de 200, etc.), e definaconfigLoadedcomotrue - 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
- Um array estático privado
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: trueouConfig loaded: falseMax 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]"
}
}
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator