Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Projeto Relatório

Gostaria de confirmar se usei certo os getters/setters, ainda sinto dificuldade em saber quando uso cada um

package br.com.alura.relatorioproduto;

public class PrincipalRel {
    public static void main(String[] args) {
        Produto produto = new Produto();
        produto.setNome("Garrafa");
        produto.setPreco(98.90);
        produto.setQuantidade(2);

        produto.exibir();
    }
}
package br.com.alura.relatorioproduto;

public class Produto {
    private String nome;
    private double preco;
    private int quantidade;
    
    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public void exibir(){
        System.out.printf("Produto: %s \nPreço: R$ %.2f \nQuantidade em estoque: %d", nome, preco, quantidade);
    }
}
2 respostas
solução!

Seu código está bom, aplicando encapsulamento correto de métodos, separação de responsabilidades e sim você está fazendo o uso correto dos métodos Setter para atribuição dos valores ao Objeto Produto. Só uma coisa, quando você estiver trabalhando com prints usando o printf não é recomendado que use "\n" como você fez, mas sim o placeholder correto que seria o "%n", isso no printf. Então, ao invés de ficar assim:

Seu código de exibir

public void exibir(){
        System.out.printf("Produto: %s \nPreço: R$ %.2f \nQuantidade em estoque: %d", nome, preco, quantidade);
}

Ficaria assim:

Código corrigido

public void exibir(){
        System.out.printf("Produto: %s %nPreço: R$ %.2f %nQuantidade em estoque: %d", nome, preco, quantidade);
}

Por mais que as duas tenham o mesmo efeito visualmente, seria melhor respeitar estas regras de sintaxe. E uma dica bônus: quando estiver um pouco mais avançado nos estudos, dê uma olhada na classe BigDecimal do Java para trabalhar com valores monetários, como no caso da sua variável "price". Outra dica: além da BigDecimal, olhe também a DecimalFormat para trabalhar com formatação de números, para não precisar ficar passando %.nf onde 'n' é o número de casas decimais.

No mais, seu código como está já está excelente, mostra bastante empenho e uso correto da orientação a objetos.

Os metodos Getter servem para voce poder retornar os valores de uma variavel num objeto ou de um objeto. Como exemplo, vamos pegar os atributos "nome" e "preco" e printa-los na tela desta forma:

package relatorioproduto;

public class PrincipalRel {
    public static void main(String[] args) {
        Produto produto = new Produto();
        produto.setNome("Garrafa");
        produto.setPrice(98.90);

        System.out.println("Nome do Produto: " + produto.getNome());
        System.out.println("Preco do Produto: " + produto.getPrice());
    }
}

A saida no console e esta:
Imagem Ilustrativa
Os metodos Getters tambem servem para fazer comparacoes em condicionais, como por exemplo, ver se o preco do produto e maior que 100, nesta usei operador ternario:

public class PrincipalRel {
    public static void main(String[] args) {
        Produto produto = new Produto();
        produto.setNome("Garrafa");
        produto.setPrice(98.90);

//        if (produto.getPrice() > 100) {
//            System.out.println("Preco e maior que cem");
//        } else {
//            System.out.println("Preco e menor que cem");
//        }

        String result = produto.getPrice() > 100 ? "Preco e maior que cem" : "Preco e menor que cem"; // Operador Ternario
        System.out.println(result);
    }
}

Saida:
Imagem2

Ja os metodos Setters servem como um refresh ou update, eles atualizam o valor padrao da variavel para um novo valor passado, seja por meio de um Scanner ou alguma outra logica interna do programa, uma forma caso voce nao queria que os valores se tornem mutaveis no seu Objeto, voce poderia passa-los direto no construtor, desta forma os valores nao poderiam ser alterados apenas acessado pelos Getters assim:

Versao sem lombok com boilerplate

package relatorioproduto;

public class Produto {
    private final String nome;
    private final double price;
    private final int quantidade;
    
    public Produto(String nome, double price, int quantidade) {
        this.nome = nome;
        this.price = price;
        this.quantidade = quantidade;
    }
    
    public String getNome() {
        return nome;
    }
    
    public double getPrice() {
        return price;
    }
    
    public int getQuantidade() {
        return quantidade;
    }

    public void exibir(){
        System.out.printf("Produto: %s \nPreço: R$ %.2f \nQuantidade em estoque: %d", nome, price, quantidade);
    }
}

Versao com lombok sem boilerplate

package relatorioproduto;

@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.AllArgsConstructor(access =  lombok.AccessLevel.PUBLIC)
public class Produto {
    private final String nome;
    private final double price;
    private final int quantidade;
    
    public void exibir(){
        System.out.printf("Produto: %s \nPreço: R$ %.2f \nQuantidade em estoque: %d", nome, price, quantidade);
    }
}

Class Main

package relatorioproduto;

public class PrincipalRel {
    public static void main(String[] args) {
        Produto produto = new Produto("Garrafa", 98.90, 2);

        System.out.println("Name: " + produto.getNome());
        System.out.println("Price: " + produto.getPrice());
        System.out.println("Quantity: " + produto.getQuantidade());
    }
}

Saida:
Imagem3

Espero te-la ajudado, boa sorte em seus estudos!