2
respostas

[Dúvida] Dúvida sobre o desafio

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

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

@Override
public String toString() {
    return "Produto: " + nome + " Preço: R$ " + preco + " Quantidade em estoque: " + quantidade;
}

}

public class ProdutoPerecivel extends Produto {

String dataDeValidade;

public ProdutoPerecivel(String nome, double preco, int quantidade, String dataDeValidade) {
    super(nome, preco, quantidade);
    this.dataDeValidade = dataDeValidade;
}

}

import java.util.ArrayList;

public class Main { public static void main(String[] args) { Produto borracha = new Produto("Borracha", 5.90, 1); Produto caneta = new Produto("Caneta bic", 2.50, 2); Produto lapiseira = new Produto("Lapiseira 0.7", 7.50, 1); ProdutoPerecivel carne = new ProdutoPerecivel("Acém moído 1kg", 17.90, 1, "25/02/2024");

    ArrayList<Produto> listaDeProdutos = new ArrayList<>();
    listaDeProdutos.add(borracha);
    listaDeProdutos.add(lapiseira);
    listaDeProdutos.add(caneta);

    System.out.println("Tamanho da lista de produtos: " + listaDeProdutos.size());
    System.out.println("Produto: " + listaDeProdutos.get(0));
    System.out.println("Lista de produtos: " + listaDeProdutos.toString());
    System.out.println(carne);

}

}

Ao imprimir o produto perecivel, notei que ele retorna somente os dados que inseri no metodo toString, deixando para trás a validade que defini para o produto. Para corrigir isso seria necessário adicionar uma condicional dentro do método?

2 respostas

Oi, Pedro! Como vai?

Sua ideia faz sentido, mas o problema aqui é que a classe ProdutoPerecivel não sobrescreveu o método toString(). Como resultado, ele usa o toString() da classe Produto, ignorando o atributo dataDeValidade.

Resolva fazendo o seguinte: sobrescreva o método toString() na classe ProdutoPerecivel, chamando o super.toString() e adicionando a validade:

@Override
public String toString() {
    return super.toString() + " Validade: " + dataDeValidade;
}

Agora, ao imprimir um ProdutoPerecivel, ele exibirá todos os detalhes corretamente.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Outra forma talvez não melhor do que sobrescrever o método toString, seria simplesmente ir na variável carne e chamar o método getDataDeValidade, aqui está um exemplo:

package com.rickmviana.github;

import com.rickmviana.github.products.PerishableProduct;
import com.rickmviana.github.products.Product;

import java.util.ArrayList;
import java.util.List;

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

        List<Product> products = new ArrayList<>();
        products.add(new PerishableProduct("Uva", 6.99, 100));

        PerishableProduct perishableProduct = (PerishableProduct) products.getFirst();
        perishableProduct.setDataValidity("25/05/2025");

        System.out.println(perishableProduct + " - Data: " + perishableProduct.getDataValidity());

        products.forEach(product -> System.out.println(product.toString()));


    }
}

Você poderia concatenar com o toString da superclass.