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!