Controle de Tarefas - POO [RESOLVIDO]

Boa dia, estou com um trabalho de faculdade pra fazer, mas estou com uma certa dificuldade com uma parte do trabalho.
É um simples controle de tarefas, onde o usuário cadastra uma tarefa com uma prioridade e uma descrição, em seguida, ele adiciona os “itens de tarefa” com um percentual e descrição na “tarefa”.
Quando o item de tarefa é concluido, a soma do percentual da tarefa deve ser atualizado. Esse é o problema.
A conclusão é feita quando uma data é setada para o item de tarefa, antes ou depois de ser adicionado a tarefa.
O problema é que eu não sei como referenciar a tarefa quando eu for chamar o método “concluir”, e se eu somente chamar tarefa.atualizaStatus(); ele da um NullPointerException. Alguém pode me ajudar? Eu preciso atualizar a tarefa depois que o método concluir for chamado.

Segue o meu fonte:

Classe Tarefa

package aula.java.poo;

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

public class Tarefa {
	private double prioridade;
	private String nome;
	private Date dataLimite;
	private double percentual = 0.0;
	private String detalhamento;
	private StatusTarefa status;

	private List<ItemTarefa> itens = new ArrayList<ItemTarefa>(); //Lista de itens de tarefas

	//Construtor da classe
	public Tarefa(double prioridade, String nome){	
		this.prioridade = prioridade;
		this.nome = nome;
		this.status = status.PENDENTE;
	}

	//Adiciona um novo item a tarefa
	public void adicionaItem(ItemTarefa item){
		this.itens.add(item);
		item.setTarefa(this);

		if(item.getDataExecucao() != null)
		   atualizaStatus();
	}

	//Atualiza o status da tarefa
	public void atualizaStatus(){
		percentual = 0.0;
		for(ItemTarefa it : itens){
			if(it.getDataExecucao() != null){
				percentual += it.getPercentual();
			}
		}
	}

	public double getPercentual() {
		return percentual / itens.size();
	}

	//M�todo toString sobrescrito de acordo com o pedido
	@Override
	public String toString() {
		super.toString();
		return prioridade+" - "+nome;
	}

	//Getters e Setters
	public List<ItemTarefa> listaItens(){
		return itens;
	}

	public List<ItemTarefa> getItens() {
		return itens;
	}

	public Date getDataLimite() {
		return dataLimite;
	}

	public void setDataLimite(Date dataLimite) {
		this.dataLimite = dataLimite;
	}

	public String getDetalhamento() {
		return detalhamento;
	}

	public void setDetalhamento(String detalhamento) {
		this.detalhamento = detalhamento;
	}

	public double getPrioridade() {
		return prioridade;
	}

	public String getNome() {
		return nome;
	}

	public StatusTarefa getStatus() {
		return status;
	}

}

Classe Item de Tarefa

package aula.java.poo;


public class ItemTarefa {
	private double percentual;
	private String descricao;
	private String dataExecucao;
	private Tarefa tarefa;

	public ItemTarefa(double percentual, String descricao){
		this.percentual = percentual;
		this.descricao = descricao;
	}
   //Conclui a tarefa e atualiza o status
	public void concluir(String data){
		dataExecucao = data;
		tarefa.atualizaStatus();
	}

	@Override
	public String toString() {
		super.toString();
		return "["+percentual+"]"+"  "+descricao;
	}
	
        //Getters e Setters
	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}

	public double getPercentual() {
		return percentual;
	}

	public void setPercentual(double percentual) {
		this.percentual = percentual;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getDataExecucao() {
		return dataExecucao;
	}
}

Classe Status Tarefa

package aula.java.poo;

enum StatusTarefa {
	CONCLUIDA, PENDENTE
}

Classe Principal:

package aula.java.poo;

public class Testa {
	public static void main(String[] args) {
		Tarefa tarefa = new Tarefa(1.0, "Fazer compras");
		
		ItemTarefa item1 = new ItemTarefa(100, "Comprar arroz");
		ItemTarefa item2 = new ItemTarefa(50, "Comprar feijão");
         	
		item1.concluir("20/09/2012");
		
		tarefa.adicionaItem(item1);
		tarefa.adicionaItem(item2);
		
		item2.concluir("01/01/2001");
	}
}


Você poderia postar o local onde são criadas as tarefas ([…]new Tarefa[…])?
e o local onde vc chama ‘tarefa.atualizaStatus()’ Grato. :smiley:

[quote=tgcmv]Você poderia postar o local onde são criadas as tarefas ([…]new Tarefa[…])?
e o local onde vc chama ‘tarefa.atualizaStatus()’ Grato. :D[/quote]

Obrigado por responder tgcmv.
Fiz a alteração do método conclui da classe ItemTarefa da forma que eu estava testando, mas ele gera um NullPointerException. Eu ainda não sei como atualizar a tarefa apartir da ItemTarefa. Existe uma forma melhor pra isso?

Postei a classe principal também.

Bom uma classe Tarefa é constituida de Lista mas não contrário como você fez criando uma variavél do tipo Tarefa dentro da classe ItemTarefa.
Porque você não utiliza o atualizaStatus() dentro da própria classe tarefa. Tipo você criou um itemTarefa se tudo der certo você pega algum retorno boolean por exemplo se conseguiu cadastrar um itemTarefa , e na sua própria classe Tarefa você verifica, se o retorno do método concluir for True, ai voce da um atualizaStatus() dentro da própria classe de tarefa. O nullPointer acontece porque quando você chama o tarefa.atualizaStatus(), você não tem nenhuma instância da classe Tarefa.

[quote=Fellipex]Bom uma classe Tarefa é constituida de Lista mas não contrário como você fez criando uma variavél do tipo Tarefa dentro da classe ItemTarefa.
Porque você não utiliza o atualizaStatus() dentro da própria classe tarefa. Tipo você criou um itemTarefa se tudo der certo você pega algum retorno boolean por exemplo se conseguiu cadastrar um itemTarefa , e na sua própria classe Tarefa você verifica, se o retorno do método concluir for True, ai voce da um atualizaStatus() dentro da própria classe de tarefa. O nullPointer acontece porque quando você chama o tarefa.atualizaStatus(), você não tem nenhuma instância da classe Tarefa.[/quote]

Quando a data de um item de tarefa é setado, ele ja verifica na hora que o item é adicionado a tarefa. Mas o problema é concluir o item depois que foi adicionado a tarefa.
Porque eu não tenho referencia a classe tarefa pelo item de tarefa.

Dessa forma:

tarefa.adicionaItem(item2);
item2.concluir("01/01/2001");

O que eu posso fazer depois dai? Os valores não são atualizados para a Tarefa. E eu preciso atualizá-los.

Este UML pode ser alterado? Se puder… REcomendo colocar o ‘STATUS’ no ItemTarefa. A Terafa será concluida quando todos os seus ItensTarefa estiverem com status CONCLUIDA.

Remova a tarefa do Itemtarefa. É a tarefa que tem o itens e não o contrário

Para concluir um Item, terá que fazer algo como:

for (ItemTarefa item : tarefa.getItens()) {
		//Recomendo Criar um id em item. ou sobrescrever o .equals
			if(item.getDescricao().equals("itemQQueroConcluir")){
			 item.concluir("data");
			}
		}

Talvez não seja a melhor forma de fazer isso. Mas resolve.

Recomendo que estudo padrões de projeto.
Procure o livro use a cabeça padroes de projeto e de uma lida no padrão Composite (Cap. 9). O Uso do Composite irá resolver esse problema de maneira muito mais elegante. Porém terá que mexer na estrutura toda do código.

No use a caebça ele faz um menu de restaurente com itens e subitens. Bem parecido com o que vc fez. :smiley:

1 curtida

Consegui resolver da seguinte forma:
Na classe Tarefa:

public void adicionaItem(ItemTarefa item){
		this.itens.add(item);
		item.setTarefa(this); //O item de tarefa faz parte de uma tarefa.

		if(item.getDataExecucao() != null)
			atualizaStatus();
	}

Na classe ItemTarefa:

public void concluir(String data){
		dataExecucao = data;
		
		if(this.tarefa != null)
		   this.tarefa.atualizaStatus();
	}

Funcionou direitinho! Obrigado pelas respostas!