AULA 04 MÓDULO 1 construtores ⏱ 50 min

Construtores e Garbage Collector

Garanta que objetos nasçam em estado válido. Sobrecarga de construtores, this(), Garbage Collector e a conexão com o que você viu em ED2.

construtorsobrecargathis()Garbage Collectorautoboxingmark-and-sweep

Construtores — objeto nasce válido

O construtor é chamado uma única vez: quando o objeto é criado com new. É a oportunidade de garantir que o objeto nasce em estado sempre válido — nunca incompleto, nunca inconsistente.

🚫
sem construtor customizado
new Pedido() — pedido sem cliente, sem data, sem items. Como saber se está pronto para processar? O construtor elimina esse estado inválido: ou nasce completo ou lança exceção.
1
Construtor padrão — Java cria automaticamente só se NENHUM construtor for definido. Sem parâmetros, inicializa atributos com defaults (0, null, false).
2
Construtor customizado — Define os parâmetros obrigatórios. Se definido, o padrão NÃO é mais gerado automaticamente.
3
Sobrecarga de construtores — Múltiplas assinaturas. new Pedido(cliente) e new Pedido(cliente, observacao).
4
this() — Chama outro construtor da mesma classe — evita duplicar lógica de inicialização.

Garbage Collector — Java libera memória

Em C você chama malloc e precisa chamar free manualmente. Esqueceu? Memory leak. Em Java, o Garbage Collector (GC) cuida disso automaticamente.

🎓
conexão com ED2
Você estudou em Estrutura de Dados 2 o 'método marca-varre' e 'contador de referências'. O GC do Java usa exatamente esses algoritmos — mais a coleta geracional (young/old generation). Não é mágica, é o que você já conhece.
AlgoritmoComo funcionaOnde visto
Mark-and-SweepMarca objetos alcançáveis, varre e coleta os não-marcadosED2 — coletor de lixo
Reference CountingConta referências; quando chega a 0, coletaED2 — contador de referências
Generational GCObjetos novos em Young Gen, sobreviventes vão para Old GenJVM — mais eficiente

Wrappers e autoboxing — cuidado!

Autoboxing converte automaticamente entre primitivos e Wrappers. Conveniente, mas com armadilhas.

⚠️
NullPointerException por autoboxing
Integer x = null; int y = x; // NullPointerException em runtime! Java tenta fazer unboxing de um null. Sempre verifique null antes de desempacotar.
java
// Construtores com sobrecarga e this()

public class Pedido {
    private final String codigo;
    private final String cliente;
    private String observacao;
    private double total;

    // Construtor principal — toda validação aqui
    public Pedido(String codigo, String cliente, String observacao) {
        if (codigo == null || cliente == null)
            throw new IllegalArgumentException("Código e cliente obrigatórios");
        this.codigo = codigo;
        this.cliente = cliente;
        this.observacao = observacao;
    }

    // Sobrecarga — delega para o principal com this()
    public Pedido(String codigo, String cliente) {
        this(codigo, cliente, ""); // this() chama outro construtor
    }

    public String toString() {
        return "Pedido[" + codigo + "] " + cliente
               + (observacao.isEmpty() ? "" : " - " + observacao);
    }
}

// Autoboxing — conveniência com armadilha
List<Integer> notas = new ArrayList<>();
notas.add(8);       // autoboxing: int 8 → Integer.valueOf(8)
int n = notas.get(0); // unboxing: Integer → int

Integer x = null;
// int y = x;       → NullPointerException!
// if (x == null) tratar antes
quiz · aula 04
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Quando Java cria o construtor padrão automaticamente?
QUESTÃO 02
O que faz this() dentro de um construtor?
QUESTÃO 03
Qual perigo do autoboxing com Integer null?
0/3