1
resposta

Cadastro de produtos com validação

Acabei por não usar o argumento SET() nas validações, fui direto criando uma nova função de retorno e invalidando. Há algum erro no encapsulamento nisso?

programa principal
import java.util.Scanner;
public class ValidarPrecos {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
while(true){
System.out.println("Informe o nome do produto:");
String nome_produto = teclado.nextLine();
double va
lor_produto = ValidarNumeros.ValidarNumerosDouble(teclado, "Informe o valor do produto");
teclado.nextLine();
CadastrandoPreços preco = new CadastrandoPreços(nome_produto, valor_produto);
preco.ValidandoPrecos();
System.out.println("");
System.out.println("Quer continuar? [S/N]");
char c = teclado.next().toUpperCase().charAt(0);
while(c!='S' && c!='N'){
System.out.println("Inválido ! Apenas SIM ou NÃO !");
c = teclado.next().toUpperCase().charAt(0);
}if(c=='S'){
System.out.println("Continuando !");
teclado.nextLine();
}else {
System.out.println("Finalizando o programa !");
break;
}
}
}

}

Classe de encapsulamento
public class CadastrandoPreços {
private String nome_produto;
private double preco_produto;
public CadastrandoPreços(String nome_produto, double preco_produto) {
this.nome_produto = nome_produto;
this.preco_produto = preco_produto;
}
public void ValidandoPrecos(){
if(preco_produto<0){
System.out.println("Valor negativo desconsiderado !");
System.out.printf("Informações do produto:\nNome: %S\nValor: R$ 0,00", nome_produto);
}
else {
System.out.printf("Informações do produto:\nNome: %S\nValor: R$ %.2f\n", nome_produto, preco_produto);
}
}
}

1 resposta

Olá, Guilherme! Como vai?

Essa é uma dúvida excelente e muito comum quando estamos fazendo a transição para a Orientação a Objetos. Direto ao ponto: sim, há um pequeno "desvio" dos princípios de encapsulamento no seu código, embora ele funcione logicamente.

Vou te explicar o porquê e como o uso do set() (método modificador) protege melhor a sua classe:

1. O Conceito de Estado Inválido

No encapsulamento, o objetivo é garantir que um objeto nunca exista em um estado inválido.

No seu código, você permite que o objeto CadastrandoPreços seja criado com um preço negativo no construtor (this.preco_produto = preco_produto). A validação só acontece depois, na hora de imprimir (ValidandoPrecos). Isso significa que, entre a criação e a impressão, seu sistema tem um objeto "mentiroso" na memória com valor negativo.

2. Por que usar o set() ou validar no Construtor?

O ideal é que a validação aconteça dentro da classe, antes mesmo do valor ser atribuído à variável private. Se você colocar a lógica de validação dentro de um método setPrecoProduto(double preco), você centraliza a regra.

Veja como ficaria uma abordagem mais robusta seguindo o encapsulamento:

public class CadastrandoPreços {
    private String nome_produto;
    private double preco_produto;

    public CadastrandoPreços(String nome_produto, double preco_produto) {
        this.nome_produto = nome_produto;
        setPrecoProduto(preco_produto); // Usa o setter para validar já na criação
    }

    public void setPrecoProduto(double preco) {
        if (preco < 0) {
            System.out.println("Valor negativo desconsiderado! Definindo como 0.");
            this.preco_produto = 0;
        } else {
            this.preco_produto = preco;
        }
    }
}

3. A Vantagem Técnica

Imagine que seu sistema cresça e agora você tenha 10 lugares diferentes que mostram o preço do produto.

  • Do jeito que você fez, você teria que chamar ValidandoPrecos() em todos esses 10 lugares.
  • Do jeito encapsulado (com set), você garante que o valor armazenado nunca seja negativo. Assim, qualquer outro método que ler preco_produto terá certeza de que o dado é confiável.

Resumo

  • Seu erro: Permitir que a variável privada receba um valor "sujo" (negativo) para só "limpar" na hora de exibir.
  • A solução: Validar no momento da atribuição (seja no set ou no construtor), garantindo a integridade do objeto desde o nascimento.

Faz sentido para você essa ideia de "proteger o dado na entrada"? Se você alterar o preço do produto em algum outro ponto do programa no futuro, o uso do set() vai te dar muito mais segurança!

Espero que possa ter lhe ajudado!