listaComProdutos(),
Bom eu entendi a logica da função, que foi trazer uma lista de produtos e suas categorias e armazena-las para listagem, MAS NÃO quero discutir logica de programação.
O problema pra mim é o seguinte trecho de código (código completo no final do tópico)
ultima.adicionaListaProdutos(produto);
Como é adicionada o 'produto' a instancia 'ultima' e a list 'listaCategorias' recebe o produto ?
A 'ultima' aponta para 'listaCategorias' ? se ele referencia a lista em que parte do código é feito isso ?
Senão como o valor vai parar na 'listaCategorias'.
Na classe Categoria 'listaProdutos' é final, se ela fosse static eu até intenderia, porque seria um valor da CLASSE e não do objeto. Acho que talvez não entendi direito o comportamento de FINAL.
Até coloquei um Sysout na 'listaCategorias' no momento que 'ultima' recebe o produto para verificar que o valor estava mudando como podem ver no trecho de código.
Mas é isso a duvida.
Desde já agradeço.
public class Categoria {
private Integer id;
private String nome;
private final List<Produto> listaProdutos = new ArrayList<>();
public Categoria(Integer id, String nome) {
super();
this.id = id;
this.nome = nome;
}
public void adicionaListaProdutos(Produto produto) {
this.listaProdutos.add(produto);
}
public List<Produto> getListaProdutos() {
return this.listaProdutos;
}
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
Trecho do código completo
public List<Categoria> listaComProdutos() throws SQLException {
List<Categoria> listaCategorias = new ArrayList<>();
Categoria ultima = null;
String sql = "select c.id, c.nome, p.id, p.nome, p.descricao from categorias as c "
+ "join produtos as p on p.idcategoria = c.id";
try(PreparedStatement statement = this.conn.prepareStatement(sql) ){
System.out.println("execute select " + statement.execute());
try(ResultSet rs = statement.getResultSet()) {
String nome;
String descricao;
Integer id;
while(rs.next()) {
id = rs.getInt("c.id");
nome = rs.getString("c.nome");
if(ultima==null || !ultima.getNome().equals(nome)) {
Categoria categoria = new Categoria(id, nome);
listaCategorias.add(categoria);
ultima = categoria;
}
id = rs.getInt("p.id");
nome = rs.getString("p.nome");
descricao = rs.getString("p.descricao");
Produto produto = new Produto(nome, descricao);
produto.setId(id);
System.out.println("teste1 = " + listaCategorias.get(0).getListaProdutos().size());
ultima.adicionaListaProdutos(produto);
System.out.println("teste2 = " + listaCategorias.get(0).getListaProdutos().size());
}
}
}
return listaCategorias;
}
}