Loop de Banco de dados sempre adiciona o mesmo valor do objeto

Ola pessoal
eu tenho o seguinte metodo

[code] public List getEmailPorParametro(int pessoaId, int emailId)throws Exception {
Connection conn = null;
ResultSet rs = null;
String sql = BUSCA_POR_PARAMETRO;
List listaEmail = new ArrayList();

    try {
		conn = GerenciadorConexao.getConexao();
		CallableStatement clblStmt = conn.prepareCall(sql);   
		clblStmt.setInt(1,pessoaId);
		clblStmt.setInt(2,emailId);			

		rs = clblStmt.executeQuery();
		while (rs.next()) {
			Email email = new Email();				
			email.setId(rs.getInt("EmailID"));
			email.setDescr(rs.getString("EmailDescr"));
			email.setTipoId(email.getTipoId().getContatoTipoPorId(rs.getString("EmailContatoTipoID")));
			listaEmail.add(email);
        }
	} catch (Exception e) {
			throw new Exception(e);
	}
	return listaEmail;
}[/code]

ate ai, esse codigo funciona normal, da forma que tem que ser, porem, eu pensei em criar o objeto email antes do loop ao invez de criar toda vez que rodar o loop (acho que assim consome menos memoria do servidor, estou correto?), para assim, nao ficar criando o objeto toda hora, entao fiz dessa maneira

[code] public List getEmailPorParametro(int pessoaId, int emailId)throws Exception {
Connection conn = null;
ResultSet rs = null;
String sql = BUSCA_POR_PARAMETRO;
List listaEmail = new ArrayList();
Email email = new Email();

    try {
		conn = GerenciadorConexao.getConexao();
		CallableStatement clblStmt = conn.prepareCall(sql);   
		clblStmt.setInt(1,pessoaId);
		clblStmt.setInt(2,emailId);			

		rs = clblStmt.executeQuery();
		while (rs.next()) {
			email.setId(rs.getInt("EmailID"));
			email.setDescr(rs.getString("EmailDescr"));
			email.setTipoId(email.getTipoId().getContatoTipoPorId(rs.getString("EmailContatoTipoID")));
			listaEmail.add(email);
        }
	} catch (Exception e) {
			throw new Exception(e);
	}
	return listaEmail;
}[/code]

porem, dessa forma ele me retorna o numero certo de linhas que vem do banco, mas tudo igual(sempre o ultimo registro), fazendo essa alteracao ele nao deveria adicionar o valor ao “listaEmail” e quando voltar ao loop sobre-escrever os valores e adicionar o valor novo?
é isso mesmo ou fiz algo errado?

abs
T+

É assim mesmo…você criou uma “variável” email e preencheu todo seu arraylist com ela, ou seja, toda hora que você carrega o próximo registro você tá atualizando sua variável que vai ser adicionada novamente ao array…no caso fica o último registro mesmo, pois ele é o último a atualizar email. No fim você tem um array da mesma coisa.

ola…

então… se deixar o objeto instanciado fora do while, ele sempre vai sobrescrever os valores qdo passa no while…mas do mesmo objeto…
por exemplo: o rs tem 10 registros… ele vai correr 10 vezes o while, e vai sobrescrever seu objeto email todas as vezes…
pq qdo vc cria um objeto, vc pega uma referencia apenas… e como vc criou apenas um… ele vai alterar apenas este 1 objeto criado…
Esta certo fazer como estava antes… mas vc pode fazer assim

Email email=null;
while(rs.next())
{
email=new Email();
(…)
}
entendeu??

[quote=alves.Felipe]ola…

então… se deixar o objeto instanciado fora do while, ele sempre vai sobrescrever os valores qdo passa no while…mas do mesmo objeto…
por exemplo: o rs tem 10 registros… ele vai correr 10 vezes o while, e vai sobrescrever seu objeto email todas as vezes…
pq qdo vc cria um objeto, vc pega uma referencia apenas… e como vc criou apenas um… ele vai alterar apenas este 1 objeto criado…
Esta certo fazer como estava antes… mas vc pode fazer assim

Email email=null;
while(rs.next())
{
email=new Email();
(…)
}
entendeu??
[/quote]

blz

fazer da forma como vc falou, em questao de performance, da no mesmo ou nao?
qual teria um desempenho melhor?(tudo bem que nesse caso é insigficante, porem, eu tenho um retorno de pessoas, e esse pode me retornar ate 100 registros)

abs

obrigado