1
resposta

Desafio: hora da prática - Dúvida

Desafio concluído, porém me surgiu uma dúvida.

package Exercicios;

import java.util.ArrayList;

public class ProdutoPrincipal {
    public static void main(String[] args) {

        // PRODUTOS:
        Produto produto = new Produto("Processador", 1199.55 ,1 );
        Produto produto2 = new Produto("Placa de vídeo", 1699.99, 1);
        Produto produto3 = new Produto("Teclado mecânico", 599.99, 1);

        // PRODUTOS PERECÍVEIS:

        ProdutoPerecivel produtoPerecivel = new ProdutoPerecivel("Carne", 89.99, 1, "11/07/2025");



        ArrayList<Produto> listaDeProdutos = new ArrayList<>();
        listaDeProdutos.add(produto);
        listaDeProdutos.add(produto2);
        listaDeProdutos.add(produto3);
        listaDeProdutos.add(produtoPerecivel);

        System.out.println("Tamanho da lista: " + listaDeProdutos.size());
        System.out.println("1° Item: "+ listaDeProdutos.get(0).getNomeProduto());
        System.out.println("1° Item - Preço: " + listaDeProdutos.get(0).getPreco());
        System.out.println("1° Item - Quantidade: " + listaDeProdutos.get(0).getQuantidade());
        System.out.println(listaDeProdutos);
    }
}
package Exercicios;

public class Produto {
    private String nomeProduto;
    private double preco;
    private int quantidade;

    public Produto(String nomeProduto, double preco, int quantidade) {
        this.setNomeProduto(nomeProduto);
        this.setPreco(preco);
        this.setQuantidade(quantidade);
    }

    @Override
    public String toString() {
        return "\nProduto: " + getNomeProduto() + " - Preço: " + getPreco() + " - Quantidade: (" + getQuantidade() + ")";
    }



    public String getNomeProduto() {
        return nomeProduto;
    }

    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }

    public double getPreco() {
        return preco;
    }

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

    public int getQuantidade() {
        return quantidade;
    }

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

package Exercicios;

public class ProdutoPerecivel extends Produto { private String validade; public ProdutoPerecivel(String nomeProduto, double preco, int quantidade, String validade) { super(nomeProduto, preco, quantidade); this.validade = validade; }

@Override
public String toString() {
    return super.toString() + " data de validade: " + getValidade();
}

public String getValidade() {
    return validade;
}

public void setValidade(String validade) {
    this.validade = validade;
}

}

Quando vou criar um construtor qual a diferença ou utilidade de criar:

public Produto(String nomeProduto, double preco, int quantidade) {
        this.setNomeProduto(nomeProduto);
        this.setPreco(preco);
        this.setQuantidade(quantidade);
    }

ou

public Produto(String nomeProduto, double preco, int quantidade) {
        this.nomeProduto =  nomeProduto;
        this.preco = preco;
        this.quantidade = quantidade;
    }
1 resposta

Olá, Diego! Tudo bem?

Que bom que você concluiu o desafio! Vamos à sua dúvida sobre a diferença entre usar métodos setters ou atribuir diretamente os valores aos atributos no construtor.

  1. Usando setters no construtor:
public Produto(String nomeProduto, double preco, int quantidade) {
    this.setNomeProduto(nomeProduto);
    this.setPreco(preco);
    this.setQuantidade(quantidade);
}

Quando você usa os métodos setters dentro do construtor, você está aproveitando qualquer lógica adicional que possa existir dentro desses métodos. Por exemplo, se você tivesse alguma validação ou transformação de dados nos setters, ela seria aplicada automaticamente ao criar o objeto. Isso pode ser útil para manter a consistência dos dados.

  1. Atribuindo diretamente no construtor:
public Produto(String nomeProduto, double preco, int quantidade) {
    this.nomeProduto = nomeProduto;
    this.preco = preco;
    this.quantidade = quantidade;
}

Ao atribuir diretamente os valores aos atributos, o código é mais direto e pode ser um pouco mais eficiente, já que evita a sobrecarga de chamadas de método. No entanto, você perde a oportunidade de aplicar qualquer lógica que poderia estar nos setters.

Exemplo prático:

Imagine que no setter de preco você verifica se o preço é positivo antes de atribuí-lo. Usar o setter no construtor garantiria que essa verificação fosse feita ao criar o objeto, enquanto a atribuição direta não faria essa verificação.

Ambas as abordagens têm seus méritos, e a escolha pode depender do contexto e das necessidades do seu projeto.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.