[RESOLVIDO] isEmpty em ArrayList preenchida sempre retornando true

11 respostas
KamillaaaH

Olá! Estou desenvolvendo uma aplicação simples que tem como requisito controlar a locação de vídeos.

Tenho um ArrayList de aluguéis que são realizados, mas a cada vez que eu chamo o método que adiciona elementos ao ArrayList o isEmpty retorna que o ArrayList está vazio, retorna true. Mesmo depois de já ter inserido um elemento e no fim do método ter retorno do isEmpty como false. Alguém pode me explicar o motivo isso occorer?
Fiz uns testes imprimindo na tela com println os retornos, vou postar também.

  1. Classe controladora da locação que tem o método que realiza o preenchimento de ArrayList de aluguéis.
package controller;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import javax.swing.JOptionPane;
import model.*;

public class ControladoraLocacao {

	Calendar c = Calendar.getInstance();

	ControladoraDevolucao devolucao;
	Cliente cliente;
	Locadora locadora;

	public void realizarLocacao(int numeroCartaoAVS, ArrayList<Integer> filmes){
		System.out.println("Entrou aqui!");
		c.roll(Calendar.DATE, 3);
		
		Aluguel aluguel = new Aluguel(numeroCartaoAVS, filmes, c.getTime());
		System.out.println("Antes getAlugueis.isEmpty() é: " + aluguel.getAlugueis().isEmpty());
		
		if(aluguel.getAlugueis().isEmpty()){
			System.out.println("Entrou aqui no aluguel");
			aluguel.getAlugueis().add(aluguel);
			JOptionPane.showMessageDialog(null, "Locação realizada com sucesso 1");
		
			System.out.println("Agora getAlugueis.isEmpty() é: " + aluguel.getAlugueis().isEmpty());
			
		}else{
			Iterator<Aluguel> iterator = aluguel.getAlugueis().iterator();
			System.out.println("Entrou no else");
			while(iterator.hasNext()){
				System.out.println("Testando se tem clientes com alugueis");
				Aluguel aluguel1 = (Aluguel) iterator.next();
				if(aluguel1.getCartaoAVS() == numeroCartaoAVS){
					JOptionPane.showMessageDialog(null, "Cliente possui locação pendente");
					JOptionPane.showMessageDialog(null, "Valor da multa: " + devolucao.calcularMulta());
					break;
				}else if(filmes != null){
					aluguel.getAlugueis().add(aluguel);
					JOptionPane.showMessageDialog(null, "Locação realizada com sucesso 2");
					break;
				}
			}	
		}
	}
}

Saída no console:

///primeira chamada do método
Entrou aqui!
Antes getAlugueis.isEmpty() é: true
Entrou aqui no aluguel
Agora getAlugueis.isEmpty() é: false

//segunda chamada do método
Entrou aqui!
Antes getAlugueis.isEmpty() é: true
Entrou aqui no aluguel
Agora getAlugueis.isEmpty() é: false

Como podem perceber, quando eu chamo o método de novo os isEmpty() retorna true, mesmo tendo preenchido o ArrayList na chamada anterior. Por que isso acontece? Alguém pode ajudar?

11 Respostas

aix

KamillaaaH:
Olá! Estou desenvolvendo uma aplicação simples que tem como requisito controlar a locação de vídeos.

Tenho um ArrayList …
Como podem perceber, quando eu chamo o método de novo os isEmpty() retorna true, mesmo tendo preenchido o ArrayList na chamada anterior. Por que isso acontece? Alguém pode ajudar?

eu acredito que sua lista de filmes esteja sendo reinicializada a cada chamada, ou seja tem um new() ai, a cada chamada zera a lista e começa denovo.

KamillaaaH

Pois é, eu também tô desconfiando do fato de eu sempre fazer um “new Aluguel()”.

Mas como eu poderia implementar isso da melhor forma?

nel

KamillaaaH:
Pois é, eu também tô desconfiando do fato de eu sempre fazer um “new Aluguel()”.

Mas como eu poderia implementar isso da melhor forma?

Poste sua classe Aluguel que fica mais fácil para ajudarmos :slight_smile:
Mas enquanto a lista estiver dentro do Objeto Aluguel, não tem como você saber.

Você pode criar um map com id do cliente e uma lista de alugueis por exemplo.
Dessa forma, você diz que um cliente alugou n filmes. Mas se deixar a lista dentro do objeto alugueis nao vai rolar.

KamillaaaH

Classe Aluguéis:

package model;

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

public class Aluguel {

	private Date dataDevolucao;
	private int cartaoAVS;
	private ArrayList<Integer> filmes;
	private ArrayList<Aluguel> alugueis = new ArrayList<Aluguel>();
	
	public Aluguel(){
		
	}
	 
	public Aluguel(int cartaoAVS, ArrayList<Integer> filmes, Date dataDevolucao){
		this.cartaoAVS = cartaoAVS;
		this.filmes = filmes;
		this.dataDevolucao = dataDevolucao;
	}
	
	public void gerarTaxaExtra() {
	 
	}

	public int getCartaoAVS() {
		return cartaoAVS;
	}

	public void setCartaoAVS(int cartaoAVS) {
		this.cartaoAVS = cartaoAVS;
	}

	public ArrayList<Integer> getFilmes() {
		return filmes;
	}

	public void setFilmes(ArrayList<Integer> filmes) {
		this.filmes = filmes;
	}

	public Date getDataDevolucao() {
		return dataDevolucao;
	}

	public void setDataDevolucao(Date dataDevolucao) {
		this.dataDevolucao = dataDevolucao;
	}

	public ArrayList<Aluguel> getAlugueis() {
		return alugueis;
	}

	public void setAlugueis(ArrayList<Aluguel> alugueis) {
		this.alugueis = alugueis;
	}
}
nel

Oi!

É exatamente o que colega disse anteriormente e eu complementei.
Se a sua lista ficar dessa forma na classe alugueis, toda vez que instanciar um novo Aluguel terá uma nova lista.
Esse controle não pode ser feito pela própria classe, deve ser de outra forma :slight_smile:

KamillaaaH

Então meu ArrayList de Aluguéis não pode ficar na classe Aluguel, correto?

Vou tentar implementar de uma outra forma e volto aqui! XD

Obrigada por responderem! :wink:

esdras_63

Você pode deixá-lo como static daí sempre que instanciar a classe ele irá ter o mesmo valor atribuído antes. Não importa quantas vezes instanciá-la ele irá ter o mesmo valor atribuído anteriormente.

KamillaaaH

É verdade, não tinha pensado nisso… vou ver qual a melhor alternativa! =D

nel

É verdade, não tinha pensado nisso… vou ver qual a melhor alternativa! =D

Isso é uma verdade caso você queira que essa lista represente TODOS os alugueis, independente de quem tenha feito a locação e etc, ai sim, é uma alternativa o static. Caso contrário, outro objeto deve ser responsavél pelo controle.

esdras_63

Sim. Se precisar de uma lista por pessoa daí não pode ser static pois a cada objeto que representará uma pessoa haverá uma lista.

KamillaaaH

Pessoal, resolvi assim:

public class Locadora {

	private String nome;

	private String endereco;

	private Collection<Video> video;

	private Collection<Cliente> cliente;

	private Collection<Aluguel> alugueis;
...
public class Aluguel {

	private Date dataDevolucao;
	private int cartaoAVS;
	private ArrayList<Integer> filmes;

	public Aluguel(int cartaoAVS, ArrayList<Integer> filmes, Date dataDevolucao){
		this.cartaoAVS = cartaoAVS;
		this.filmes = filmes;
		this.dataDevolucao = dataDevolucao;
	}
...
package controller;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import javax.swing.JOptionPane;
import model.*;

public class ControladoraLocacao {

	Calendar c = Calendar.getInstance();
	double multa;
	ControladoraDevolucao devolucao = new ControladoraDevolucao();
	Cliente cliente;
	
	public void realizarLocacao(int numeroCartaoAVS, ArrayList<Integer> filmes, Locadora locadora){
		c.roll(Calendar.DATE, 3);

		Aluguel aluguel = new Aluguel(numeroCartaoAVS, filmes, c.getTime());

		Iterator<Aluguel> iterator = locadora.getAlugueis().iterator();
		while(iterator.hasNext()){
			Aluguel aluguel1 = (Aluguel) iterator.next();
			if(aluguel1.getCartaoAVS() == numeroCartaoAVS){
				System.out.println("Cliente está corretamente cadastrado");
				if((locadora.getAlugueis().isEmpty()) && (filmes != null)){
					locadora.getAlugueis().add(aluguel);
					JOptionPane.showMessageDialog(null, "Locação realizada com sucesso!");
				}else{
					multa = devolucao.calcularMulta(numeroCartaoAVS, locadora);
					if(multa != 0.0){
						JOptionPane.showMessageDialog(null, "Cliente possui locação pendente!");
						JOptionPane.showMessageDialog(null, "Valor da multa: " +multa);
					}else 
						if(filmes != null){
							locadora.getAlugueis().add(aluguel);
							JOptionPane.showMessageDialog(null, "Locação realizada com sucesso!");
						}
				}
			}else{
				System.out.println("Cliente não existe no cadastro");
				break;
			}
		}
	}
}

Eu sei que o código tá muito acoplado e pouco coeso, mas é essa a intenção. Todo esse projeto é para refatorar, é um trabalho final da faculdade da matérias de Desenvolvimento Avançado de Software.

Obrigada a todos que me ajudaram! =)

Criado 21 de setembro de 2011
Ultima resposta 21 de set. de 2011
Respostas 11
Participantes 4