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
Produtoe ter os camposnomeepreco. - O construtor compacto deve lançar
IllegalArgumentExceptionsepreco <= 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
- Declaramos o record
Produtocom os componentesnomeepreco. - Dentro do record, definimos um construtor compacto:
public Produto { ... }. Ele não lista os parâmetros novamente. - No corpo do construtor, verificamos se
preco <= 0. Se sim, lançamosIllegalArgumentExceptioncom a mensagem "Preço deve ser positivo". - No
main, envolvemos a criação do produto em um blocotry-catchpara capturar a exceção. - Criamos
new Produto("Caneta", -1.50), que dispara a exceção. - O
catchcaptura 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