Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

listaComProdutos(), duvida instrução do código

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;
    }

}
1 resposta
solução

Estava analisando aqui acho que entendi.

'ultima' esta apontando para 'categoria', quando é adicionado o produto a 'ultima'. 'ultima' aponta para 'categoria' e por sua vez 'categoria' aponta para um item da 'listacategoria'.

Então quando vc adiciona um produto a 'ultima' esta na verdade adicionando a 1 item da 'listaProdutos'.

Quando vc encara tudo como ponteiro fica bem mais fácil entender o código.