Médio Java

Record com validação usando construtor compacto

Enunciado

Crie um record Produto com nome (String) e preco (double). Use um construtor compacto para garantir que o preço seja maior que zero. No main, tente criar um produto com preço inválido e capture a exceção, imprimindo uma mensagem.

Requisitos

  • O record deve se chamar Produto e ter os campos nome e preco.
  • O construtor compacto deve lançar IllegalArgumentException se preco <= 0.
  • O programa deve tentar criar um produto inválido e imprimir a mensagem de erro.

Código inicial

public class Main {
    // Defina o record Produto com construtor compacto

    public static void main(String[] args) {
        // Teste a criação de um produto inválido
    }
}

Saída esperada

Erro: Preço deve ser positivo
Ver dica

No construtor compacto, você pode acessar os parâmetros diretamente e atribuir valores aos campos. Para lançar exceção, use throw new IllegalArgumentException("mensagem").

Mostrar solução
public class Main {
    // Record com construtor compacto para validação
    public record Produto(String nome, double preco) {
        public Produto {
            if (preco <= 0) {
                throw new IllegalArgumentException("Preço deve ser positivo");
            }
        }
    }

    public static void main(String[] args) {
        try {
            // Tentativa de criar produto com preço inválido
            new Produto("Caneta", -1.50);
        } catch (IllegalArgumentException e) {
            System.out.println("Erro: " + e.getMessage());
        }
    }
}

Passo a passo

  1. Declaramos o record Produto com os componentes nome e preco.
  2. Dentro do record, definimos um construtor compacto: public Produto { ... }. Ele não lista os parâmetros novamente.
  3. No corpo do construtor, verificamos se preco <= 0. Se sim, lançamos IllegalArgumentException com a mensagem "Preço deve ser positivo".
  4. No main, envolvemos a criação do produto em um bloco try-catch para capturar a exceção.
  5. Criamos new Produto("Caneta", -1.50), que dispara a exceção.
  6. O catch captura e imprime "Erro: " + e.getMessage().

Por que funciona

O construtor compacto permite validar ou normalizar os parâmetros antes que os campos sejam atribuídos. Ele é exclusivo de records e evita a repetição da lista de parâmetros. Assim, garantimos que nenhum objeto Produto seja criado com preço inválido, mantendo a integridade dos dados.

Erros comuns

  • Esquecer de chamar o construtor compacto de forma correta: O construtor compacto não tem parênteses após o nome.
    Errado: public Produto(String nome, double preco) { ... } (isso é um construtor normal, não compacto).
    Correto: public Produto { ... }.
  • Tentar atribuir valores aos campos manualmente no construtor compacto: O compilador já faz isso automaticamente após a validação.
    Errado: this.nome = nome; dentro do construtor compacto.
    Correto: apenas valide ou modifique os parâmetros; a atribuição é implícita.
  • Lançar exceção sem mensagem: Isso dificulta a depuração. Sempre forneça uma mensagem clara.

Outra forma de resolver

Se precisar de lógica mais complexa, use um construtor canônico (não compacto):

public Produto(String nome, double preco) {
    if (preco <= 0) throw new IllegalArgumentException("Preço deve ser positivo");
    this.nome = nome;
    this.preco = preco;
}

Mas o construtor compacto é mais conciso.

Saída esperada

Erro: Preço deve ser positivo