1
resposta

Cadastro de produtos com validação

public class Produto {
    private String nome;
    private double preco;

    public Produto(String nome, double preco) {
        this.nome = nome;
        if (preco < 0) {
            System.out.println("Preço inválido");
            this.preco = 0;
        } else {
            this.preco = preco;
        }
    }

    @Override
    public String toString() {
        return "Produto: " + nome +
                "\nPreço: " + preco;
    }
}
public class Exercicios {
    public static void main(String[] args) {
      Produto mouse = new Produto("Mouse", -59.9);
      System.out.println(mouse.toString());
    }
}
1 resposta

Olá, Bernardo. Como vai?

Parabéns por concluir mais um desafio! A sua implementação toca no ponto central do Encapsulamento, que é usar a própria classe para proteger as suas regras de negócio (nesse caso, garantindo que um produto nunca tenha um preço negativo).

O seu construtor realizou a validação de forma muito madura, impedindo o preço inválido e definindo um valor padrão seguro de 0.

Para elevar ainda mais o nível técnico do seu código e seguir as boas práticas de mercado em Java, trago duas sugestões muito importantes sobre tratamento de erros e consistência da classe:

1. Trate dados inválidos com Exceções

Atualmente, quando o preço é negativo, o seu código exibe uma mensagem com System.out.println e cria o objeto mesmo assim. Em sistemas reais, deixar o objeto ser criado com dados errados pode mascarar problemas no fluxo do programa.

A melhor prática em Java para barrar uma construção inválida é lançar uma exceção chamada IllegalArgumentException. Isso avisa imediatamente o sistema que houve um erro de argumento. Veja a mudança:

public class Produto {
    private String nome;
    private double preco;

    public Produto(String nome, double preco) {
        if (preco < 0) {
            // Lança um erro e interrompe a criação do objeto inválido
            throw new IllegalArgumentException("O preço do produto não pode ser negativo.");
        }
        this.nome = nome;
        this.preco = preco;
    }
}

2. Adicione os métodos Getters

Como os seus atributos nome e preco são privados (o que está corretíssimo!), se outra classe no futuro precisar apenas ler o valor do produto para somar em um carrinho de compras, ela não conseguirá, pois você não criou os métodos get.

Mesmo usando o toString() para exibir o texto completo, lembre-se de sempre disponibilizar os métodos get públicos para permitir o acesso individual e seguro a esses dados:

public String getNome() {
    return nome;
}

public double getPreco() {
    return preco;
}

3. Pequena dica sobre o toString()

No seu método main, você chamou o método explicitamente com System.out.println(mouse.toString());. No Java, quando passamos o objeto direto dentro do println, o próprio sistema já chama o método toString() de forma automática nos bastidores. Você pode deixar o seu código mais limpo escrevendo apenas:

System.out.println(mouse);

Você está pegando a essência da Orientação a Objetos muito rápido. Continue estruturando suas classes com essa mentalidade de proteção de dados!

Espero que possa ter lhe ajudado!