Acessar arraylist que está em outra classe

Bom dia a todos. Podem me ajudar a entender este código por favor?
A conexão. Entendido.

public class ConnectionFactory {
 public static Connection getConnection(){
  Connection cnn = null;
   try{
     Class.forName("com.mysql.jdbc.Driver").newInstance();
     cnn = DriverManager.getConnection("jdbc:mysql://localhost/crud", "root", "root");
    } catch (Exception e) {
     e.printStackTrace();
  }
   return cnn;
 }
}

Classe que irá ser a base da tabela no banco de dados.Entendi.

public class Cliente {
 
   private String nome;
   private Integer idade;
   //Getters e Setters
}

Insira alguns dados no banco:

Insert into Cliente values (‘Cristiano’, 22);

Insert into Cliente values (‘Fabio’, 15);

Insert into Cliente values (‘Joao’, 135);

Insert into Cliente values (‘Pedro’, 11);

Insert into Cliente values (‘Maria’, 53);

Agora vamos criar nossa classe que ira fazer o select e armazenar na ArrayList

public class ClienteCrud {
 
 public List<cliente> clientes = new ArrayList<cliente>();

 public void listar(){
  ResultSet rs = null;
  Connection cnn = ConnectionFactory.getConnection();
  try {
   PreparedStatement sql = cnn.prepareStatement("select * from cliente");
   rs = sql.executeQuery();
   while(rs.next()){
    Cliente cliente = new Cliente();
    cliente.setNome(rs.getString("nome"));
    cliente.setIdade(rs.getInt("idade"));
    clientes.add(cliente);
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
}

Classe que faz tudo acontecer. Aqui está minha dúvida:

public class ClienteView {

 public static void main(String[] args) {
  ClienteCrud cc = new ClienteCrud();
  cc.listar();
  System.out.println("--------\nSem Classificação \n--------");
  for (Cliente c : cc.clientes) { //de onde vem **clientes** ? É o List da classe ClienteCrud ?
   System.out.println(c.getNome());
   System.out.println(c.getIdade());
  }
 }
}

Entendi tudo, menos a variável clientes dentro do foreach. Se ClienteView consegue acessá-la em ClienteCrud, como isso é feito? Não deveria ser static? Ou não é isso? Agradeço desde já. Nathalie.

Consegui entender.Do jeito que a instância da classe acessa o método, acessa também a variável list global. Fiz duas novas classes, utilizando a mesma conexão e o mesmo bean:

import java.sql.*;
import java.util.*;

public class AcessoListBD {
	
	List<Cliente> acessolist = new ArrayList<Cliente>();
	
	public void ler(){
		Connection con = ConnectionFactory.getConnection();
		try{
			Statement stm = con.createStatement();
			ResultSet rs = stm.executeQuery("SELECT * FROM cliente");
			while(rs.next()){
			Cliente clientes = new Cliente();
				clientes.setNome(rs.getString(1));
				clientes.setIdade(rs.getInt(2));
				acessolist.add(clientes);
			}
		}catch(SQLException e){}				
	}
}

a outra classe:

public class AcessoPrincipal {
	public static void main(String[] args){
		
		AcessoListBD acessobd = new AcessoListBD();
		acessobd.ler();
		for(Cliente cli : acessobd.acessolist){
			System.out.println(cli.getNome());
			System.out.println(cli.getIdade());
		}
		
	}
}

ola

este é um péssimo pattern. isso significa que o seu ciclo de vida é:

vc cria o objeto. manda listar e ve o resultado em um atributo. e depois? se mandar listar de novo vc vai alterar esta atributo. em um ambiente que tem concorrencia como uma Servlet vc vai ter uma bela surpresa.

sugestão:

metodo ler vai retornar uma List<Cliente>

remove esse acessolist, cria isso dentro do metodo ler como uma variavel.

retorna ao final

em caso de exception, manda pelo menos imprimir a stack trace

catch ( … e ) { e.printStackTrace(); }

ai o seu for vira

for ( Client cli : acessobd.ler() ) {

que por acaso é a receita pra criar um DAO

Obrigada pela resposta peczenyj. Dá para acreditar que eu estava fazendo como você está dizendo? Aí vi este outro código e achei que estava melhor, mais desacoplado. Refazer tudo. Mas me responda uma dúvida: acho que entendi que para uma variável ser alcançada por outra classe tem que ser static. Pode me explicar isso? Mais uma vez obrigada.

Vamos usar os termos corretos

Uma variavel existe dentro de um método, construtor, etc. quando falamos de algo declarado dentro da classe nos temos os atributos

Um atributo static esta ligado a classe. Um bom exemplo é a classe System que trm um atributo out no famoso System.out.println

Se o atributo não é estatico ele é um atributo de instância e ele é especifico de cada instância do objeto (enquanto static pertence a classe é acessível por todos)

Ah mas tem q pegar uma variável

Não. Objetos se comunicam por orientação a objetos. Vc quer invocar um metodo e pegar o seu retorno em boa parte dos casos.

Um metodo é uma mensagem. Vc diz “me dá os clientes”.

Por que chamar ler() e depois acessar um atributo estatico é desaconselhável: Pq não é óbvio que vc tem fazer isso nessa ordem. Desacoplado até demais. Fora questões de concorrência no futuro

Mas eu posso fazer? Se compila, pode.

Mas eu não faria.

Onde eu faria: um atributo de “estatísticas”, por exemplo, que não tem haver com o metodo ler em particular.