Dúvida com ArrayList

11 respostas
knik

O código abaixo compila e funciona normalmente. No entanto o Eclipse sinaliza que o emprego do ArrayList assim está depreciado.

ClienteBO clienteBO = new ClienteBO(); ArrayList<ClienteVO> lista = clienteBO.listarCliente(); for (ClienteVO clienteVO : lista) { System.out.println( "Código: " + clienteVO.getCod_cliente() ); System.out.println( "Nome: " + clienteVO.getNome() ); System.out.println( "CPF: " + clienteVO.getCpf() ); System.out.println("\n"); }
Como resolver isto, pois como percebem estou usando OO, e não há como fazer:

ArrayList<ClienteVO> lista = new ArrayList<ClienteVO>();

Pois não consegui desenvolver e não achei nenhuma referência sobre isto (usando OO, igual ao meu código acima). Será que tem de deixar o código com esta warning? Ignorar um erro potencial?.. Pois no futuro ninguém garante que o código possa funcionar…
Obrigado ao pessoal pela paciência.

11 Respostas

Rafael_Nunes

[edit]
Qual o retorno do seu listarClientes()? Qual a warning do Eclipse?

andreiribas

cara usa a interface List para receber os dados.

e tem que ver o tipo de retorno do método
listarCliente(), ele tem que retornar alguma implementação de List, como LinkedList, ArrayList, etc.

Mas acho que o retorno do método listarCliente(), no teu caso, deve ser só um ArrayList, sem o uso de Generics, e daí você tem que mudar o retorno do método para
ArrayList, ou fazer um cast para ClienteVO na hora de atribuir à variável lista

knik

Amigos,
O retorno é uma ArrayList.
A warning é “Type safety: the expression of type ArrayList needs unchecked conversion to conform to List”.

Mudei o código assim:

List<ClienteVO> lista = clienteBO.listarCliente();

No entanto a warning permanece. Sei que tem de fazer umcast mas não sei como fazê-lo.
Alguém tem uma nova idéia?

Rafael_Nunes

Na declaração do método, você está informando o tipo da lista que vai retornar?

ex:

public List<ClienteVO> listarCliente(){ //code }

knik

Desculpem, veja o resto do código

public class ClienteBO {
	
	private ClienteDAO clieClienteDAO;
	
	public ClienteBO(){
		clieClienteDAO = FabricaDAO.getClienteDAO();
	}

	public ArrayList listarCliente()
		throws VendasPrazoNegocioException{	
		return clieClienteDAO.listarCliente();	
	}
	
}
public interface ClienteDAO {		
	public abstract ArrayList listarCliente() throws VendasPrazoPersistenciaException;
	
}
public class ClienteImpl implements ClienteDAO{	
	
	Connection con = Conexao.getInstancia().getConnection();
	PreparedStatement pstm = null;
	ResultSet res = null;
	String sql = null;
	
	public ArrayList listarCliente()  throws VendasPrazoPersistenciaException{
		
		ArrayList<ClienteVO> lista = new ArrayList<ClienteVO>();		
		sql = "select * from cliente";
		try{
			pstm = con.prepareStatement(sql);
			res = pstm.executeQuery();
			while ( res.next() ){
				ClienteVO clienteVO = new ClienteVO();
				clienteVO.setCod_cliente( res.getInt("cod_cliente") );
				clienteVO.setNome( res.getString("nome") );
				clienteVO.setCpf( res.getString("cpf") );
				lista.add(clienteVO);				
			}
		}catch(SQLException e){
			throw new VendasPrazoPersistenciaException( 
					"Pesquisa resultou nula." +
					"\n" + e.getMessage() );
		}finally{
			Conexao.getInstancia().desconecta(con, pstm, res);			
		}
		return lista;
		
	}
	
}
E o cliente VO é um VO simples com getters e setters.
knik

OK - resolvi o problema.
Obrigado pela luz. Faltou fazer em todos os métodos que implementam ArrayList.

Dieval_Guizelini

Amigo,

algumas recomendações:

Todos os métodos declarados nas interaces são implicitamente public e abstract, logo sua interface pode ser escrita assim:

public interface ClienteDAO { List<ClienteVO> listarCliente() throws VendasPrazoPersistenciaException; }

Não compreendi a classe ClienteBO, qual o sentido dela?

por quê você quer manter uma instância do DAO? você pode criá-los nas classes de negócio, em facade, brigde etc.

certo?

knik

A classe BO, como o nome diz “buziness object”, segundo o que entendo, é a responsável por iniciar o tráfego do VO pelas camadas de negócio e persistência, providenciando um melhor isolamento da view com o modelo. É evidente que ela pode ser descartada, bastando fazer algumas modificações… Será que estou mesmo certo?

knik

A fábrica DAO torna o código mais elegante e fácil para manutenção.

knik

Obrigado pela dica - realmente não precisa abstract nas interfaces (esta cláusula já está implicita).

Rafael_Nunes

Se o seu ambiente não for distribuído, com EJB’s e essas parafernalhas todas, você pode(na verdade deveria) é descartar estes VO’s(que teve o nome redefinido para TO ou DTO).

Criado 27 de novembro de 2006
Ultima resposta 27 de nov. de 2006
Respostas 11
Participantes 4