Seguem classes Produto, ProdutoPerecivel e Main.
Na Classe Produto, getters e setters estão declarados em linha apenas por questão de espaço no post.
Na Classe ProdutoPerecivel, seguem observações:
- Utilização de tipo LocalDate para dataValidade, pois tipos como Calendar e Date possuírem parte dos métodos como @Deprecated, enquanto uso de LocalDate ser mais recomendado na comunidade;
- Realizado lançamento de exceções para o preenchimento das datas dos produtos perecíveis, considerando os casos de preenchimento como null, string vazía ("") ou em formato de data inválida (Ex.: 31/02/2025 - fevereiro não possuir 31 dias; 23/15/2025 - não possuir maior que 12)
Aceito sugestões para complementar código.
Em caso de dúvida sobre legibilidade ou trecho de código, peço que me questionem.
Classe Produto:
public class Produto {
private String nome;
private double preco;
private int quantidade;
public Produto() {}
public Produto(String nome, double preco, int quantidade) {
this.nome = nome;
this.preco = preco;
this.quantidade = quantidade;
}
public String getNome() { return this.nome; }
public void setNome(String value) { this.nome = value; }
public double getPreco() { return this.preco; }
public void setPreco(double value) { this.preco = value; }
public int getQuantidade() { return this.quantidade; }
public void setQuantidade(int value) { this.quantidade = value; }
@Override
public String toString() {
String item = (this.getQuantidade() >= 0 && this.getQuantidade() < 2) ? " item" : " itens";
return "\nProduto " + this.getNome() + " custa R$ " + this.getPreco() + ". Tem " + this.getQuantidade() + item + " no estoque";
}
}
Classe ProdutoPerecivel:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class ProdutoPerecivel extends Produto {
private LocalDate dataValidade;
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("d/M/yyyy");
public ProdutoPerecivel(String nome, double preco, int quantidade, String dataValidadeStr) {
super(nome, preco, quantidade);
setDataValidade(dataValidadeStr);
}
public void setDataValidade(String dataValidadeStr) {
try {
if (dataValidadeStr == null) { throw new NullPointerException(); }
if (dataValidadeStr.trim().isEmpty()) { throw new IllegalStateException(); }
this.dataValidade = LocalDate.parse(dataValidadeStr, FORMATTER);
} catch (NullPointerException e) {
throw new IllegalArgumentException("Data de validade não pode ser nula.");
} catch (IllegalStateException e) {
throw new IllegalArgumentException("Data de validade não pode ser vazia.");
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("Data inválida.");
}
}
public LocalDate getDataValidade() {
return this.dataValidade;
}
@Override
public String toString() {
boolean vencido = dataValidade.isBefore(LocalDate.now());
return super.toString() +
"\nValidade: " +
dataValidade.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) +
(vencido ? " (PRODUTO VENCIDO)" : "");
}
}
Classe Main:
import java.util.ArrayList;
import com.exercicios.classes.Produto;
import com.exercicios.classes.ProdutoPerecivel;
public class Main {
public static void main(String[] args) {
ArrayList<Produto> listaDeProdutos = new ArrayList<>();
Produto produtoUm = new Produto("Arroz", 3.10, 5);
Produto produtoDois = new Produto("Feijão", 2.15, 1);
Produto produtoTres = new Produto("Farofa", 2.10, 3);
ProdutoPerecivel produtoPerecivelUm = new ProdutoPerecivel("Ovo", 10.99, 12, "02/02/2001");
listaDeProdutos.add(produtoUm);
listaDeProdutos.add(produtoDois);
listaDeProdutos.add(produtoTres);
System.out.println("Tamanho da lista de produtos: " + listaDeProdutos.size());
System.out.println("Segundo item da lista de produtos: " + listaDeProdutos.get(1));
System.out.println("Itens constantes na lista de produtos: " + listaDeProdutos.toString());
System.out.println(produtoPerecivelUm);
}
}