Manipulação de datas em JAVA

Como eu poderia começar a fazer isso?

Defina a classe ProdutoPerecivel (subclasse de Produto), que deve possuir um atributo extra dataValidade. A classe ainda deve sobrepor os seguintes métodos:

retirar(), que deve ter mais um parâmetro: dataRetirada. Caso o produto já esteja armazenado a mais de dois meses, o estoque deve ser zerado, pois produtos vencidos são jogados fora. Exiba uma mensagem correspondente.
adicionar(), que somente deve adicionar produtos se o estoque estiver zerado,para não misturar produtos com diferentes datas de validade.

desde já, agradeço a ajuda!!!

Começa-se pelo começo. Qual é a sua dúvida especificamente? Como está implementada a classe Produto? Quais os outros parâmetros do método retirar()?

package atividade02;

public class Produto {

private String nome;
private int quantidade;
private double valorUnitario;

public Produto(String n, int q, double v) {

    this.nome = n;
    this.quantidade = q;
    this.valorUnitario = v;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public int getQuantidade() {
    return quantidade;
}

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

public double getValorUnitario() {
    return valorUnitario;
}

public void setValorUnitario(double valorUnitario) {
    this.valorUnitario = valorUnitario;
}

public void retirar(int quant) {

    if (quant <= quantidade) {
        quantidade -= quant;
        
        System.out.println("Quantidade retirada: " + quant);
        System.out.println("Nova quantidade:" + quantidade);
        System.out.println("");
        
    } else {
        System.err.println("Quantidade insuficiente");
    }
}

public void adicionar(int quant) {

    quantidade += quant;
    
    System.out.println("Quantidade adicionada: " + quant);
    System.out.println("Nova quantidade:" + quantidade);
    System.out.println("");
    
    
}

public void imprimirProduto() {
    System.out.println("Nome: " + nome);
    System.out.println("Quantidade: " + quantidade);
    System.out.println("Valor unitario: " + valorUnitario);
}

}

package atividade02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ProdutoPerecivel extends Produto {

private Date dataValidade;

public ProdutoPerecivel(String n, int q, double v, String data) throws ParseException {
    super(n, q, v);
    this.dataValidade = new SimpleDateFormat("dd/MM/yyyy").parse(data);
}

public Date getDataValidade() {
    return dataValidade;
}

public void setDataValidade(Date dataValidade) {
    this.dataValidade = dataValidade;
}


public void imprimir(){
    imprimirProduto();
    System.out.println("Data de validade: " + this.dataValidade);
}

}

Estou travado aqui!

Uma dentre várias formas de resolver…

1 - Produto

import java.math.BigDecimal;

public class Produto {
	private long codigoProduto;
	private String marca;
	private String nomeProduto;
	private int quantidade;
	private BigDecimal valorUnitario;
	
	public Produto(){
		quantidade = 0;
	}
	
	/*
	* Métodos do produto
	*/
	public void retirar(int quantidade){
		if(quantidade <= getQuantidade()){
			setQuantidade(getQuantidade() - quantidade);
			
			System.out.println("\nEstoque atualizado para " + getQuantidade() + " unidades.");
		}else{
			System.out.println("A quantidade em estoque abaixo do valor de retirada"
				+ "Quantidade atual: " + getQuantidade());
		}
	}
	
	public void adicionar(int quantidade){
		setQuantidade(getQuantidade() + quantidade);
		
		System.out.println("Estoque atualizado para " + getQuantidade() + " unidades.");
	}
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setCodigoProduto(long codigoProduto){
		this.codigoProduto = codigoProduto;
	}
	
	public long getCodigoProduto(){
		return codigoProduto;
	}
	
	public void setMarca(String marca){
		this.marca = marca;
	}
	
	public String getMarca(){
		return marca;
	}
	
	public void setNomeProduto(String nomeProduto){
		this.nomeProduto = nomeProduto;
	}
	
	public String getNomeProduto(){
		return nomeProduto;
	}
	
	protected void setQuantidade(int quantidade){
		this.quantidade = quantidade;
	}
	
	public int getQuantidade(){
		return quantidade;
	}
	
	public void setValorUnitario(BigDecimal valorUnitario){
		this.valorUnitario = valorUnitario;
	}
	
	public BigDecimal getValorUnitario(){
		return valorUnitario;
	}
}

2 - Produto Perecível

import java.util.Date;
import java.math.BigDecimal;

public class ProdutoPerecivel extends Produto{
	private Date dataValidade;
	
	/*
	* Métodos do produto
	*/
	public void retirar(int quantidade, String dataRetirada){
		int DOIS_MESES_VENCIDO = 2;
		/*
		* 1000 * 60 * 60 * 24 * 30 = 2592000000
		* seg    min  h    dia  mês
		*/
		long milissegundoMes = 2592000000L;
		//Date dataAtual = new Date();
		Date dataAtual = configurarData(dataRetirada);
		BigDecimal intervaloEmMilissegundos = new BigDecimal(
			dataAtual.getTime() - getDataValidade().getTime()
		);
		BigDecimal meses = intervaloEmMilissegundos.divide(
			new BigDecimal(milissegundoMes), 
			new java.math.MathContext(10)
			);
	
		if(quantidade <= getQuantidade()){
			if(meses.intValue() >= DOIS_MESES_VENCIDO){
				setQuantidade(0);
				System.out.println("Fora do prazo de vencimento. Os produtos foram descartados!");
			}else{
				setQuantidade(getQuantidade() - quantidade);
				System.out.println("Estoque atualizado para " + getQuantidade() + " unidades.");
			}
		}else{
			System.out.println("A quantidade em estoque abaixo do valor de retirada"
				+ "Quantidade atual: " + getQuantidade());
		}
	}
	
	private Date configurarData(String dataInformada){
		Date data = null;
		try{
			java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy");
			data = df.parse(dataInformada);
		}catch(java.text.ParseException pex){
				System.out.println("ERRO: conversão impossível!");
		}
		return data;
	}
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setDataValidade(String dataValidade){
		this.dataValidade = configurarData(dataValidade);
	}
	
	public Date getDataValidade(){
		return dataValidade;
	}
}

3 - Controle de Estoque

import java.math.BigDecimal;

public class ControleEstoque {
	public void listarProduto(Produto[] listaDeProdutos){
		System.out.println("\n");
		for(int produto = 0; produto < listaDeProdutos.length; produto++){
			System.out.println("Código: " + listaDeProdutos[produto].getCodigoProduto());
			System.out.println("Descrição: " + listaDeProdutos[produto].getMarca() 
				+ " " + listaDeProdutos[produto].getNomeProduto());
			System.out.println("Quantidade: " + listaDeProdutos[produto].getQuantidade());
			System.out.println("Valor unitário: " + listaDeProdutos[produto].getValorUnitario());
			System.out.println("\n");
		}
	}
	
	public static void main(String[] args){
		ControleEstoque controleEstoque = new ControleEstoque();
		Produto[] produtos = new Produto[3];
		
		Produto produto1 = new Produto();
		produto1.setCodigoProduto(12L);
		produto1.setMarca("San Remo");
		produto1.setNomeProduto("Bacia Softpack 22 litros");
		produto1.adicionar(80);
		produto1.setValorUnitario(new BigDecimal("14.56"));
		
		ProdutoPerecivel produtoPerecivel1 = new ProdutoPerecivel();
		produtoPerecivel1.setCodigoProduto(190L);
		produtoPerecivel1.setMarca("Nestlé");
		produtoPerecivel1.setNomeProduto("Iogurte sabor morango");
		produtoPerecivel1.adicionar(262);
		produtoPerecivel1.setValorUnitario(new BigDecimal("3.54"));
		produtoPerecivel1.setDataValidade("26/05/2019");
		
		ProdutoPerecivel produtoPerecivel2 = new ProdutoPerecivel();
		produtoPerecivel2.setCodigoProduto(3145L);
		produtoPerecivel2.setMarca("Zaeli");
		produtoPerecivel2.setNomeProduto("Achocolatado em pó");
		produtoPerecivel2.adicionar(573);
		produtoPerecivel2.setValorUnitario(new BigDecimal("8.19"));
		produtoPerecivel2.setDataValidade("19/04/2019");
			
		produtos[0] = produto1;
		produtos[1] = produtoPerecivel1;
		produtos[2] = produtoPerecivel2;
		
		produtoPerecivel1.retirar(10, "05/10/2019");
		produtoPerecivel2.retirar(10, "15/10/2019");
		
		controleEstoque.listarProduto(produtos);
	}
}

Rodando…

image

Muito obrigado, valeu mesmo!!!

eu precisava manter esse método construtor

private Date dataValidade;

public ProdutoPerecivel(String n, int q, double v, String data) throws ParseException {
    super(n, q, v);
    this.dataValidade = new SimpleDateFormat("dd/MM/yyyy").parse(data);
}

existe outra forma de manter a data aqui, mais simplicada, sem precisar de get(), apenas para teste via método construtor?

Classes e métodos pequenos e de responsabilidade bem definida, isso é sinônimo de um código que observa a Orientação à Objetos. Apesar do construtor não ser um método, isso também vale para construtores. Se você quer ‘entupir’ o construtor de coisas para ele tomar conta (encher ele de responsabilidade), fique a vontade. A lógica está posta (mas não esgotei o conteúdo, que fique bem claro). Basta adequar às suas necessidades, ou seja, agora é contigo.