[Java] Utilizzo degli array list

FabioFR1
Ciao a tutti. Sono alle prime armi nella programmazione in Java e vi scrivo per chiedervi aiuto su un problema che mi si presenta nella gestione degli array list. Il programma riguarda la gestione di un negozio online, vi è un database in cui è memorizzato l'elenco dei clienti con i relativi dati che sarà opportunamente "prelevato" durante l'esecuzione del programma. Ho implementato un metodo che salva in un array list l'elenco dei clienti presenti nel database. In una classe di model ho inizializzato l'array list su cui dovranno essere salvate le informazioni sul cliente impostando e attingendo per mezzo dei metodi getter e setter:
    private ArrayList<Cliente> listaClienti;
    public ArrayList<Cliente> getListaClienti() {
            return listaClienti;	//**
    }

    public void setListaClienti(ArrayList<Cliente> listaClienti) {
        this.listaClienti = listaClienti;
    }


Il metodo che setta i valori di listaClienti si trova in una classe DAO il quale interagisce con il DB ed è definita come
    public Cliente listaClienti() {
        ArrayList<String[]> risultato = DbConnection.getInstance().eseguiQuery("SELECT * FROM store.persona" +
                " JOIN store.cliente ON persona_idpersona=idpersona");


        ArrayList<Cliente> listaClienti = new ArrayList<Cliente>();
        Iterator<String[]> i = risultato.iterator();

        while(i.hasNext()) {
            String[] riga = i.next();
            Cliente c = new Cliente();
            c.setNome(riga[1]);
            c.setCognome(riga[2]);

            listaClienti.add(c);

        }
        Cliente c = new Cliente();
        c.setListaClienti(listaClienti);	//*

        return c;

    }

All'interno di una classe di view è presente un tratto di codice in cui viene eseguito il metodo che interroga il db ed il richiamo dell'array list appena creato:
        new ClienteDAO().listaClienti();
        ArrayList<Cliente> list = new Cliente().getListaClienti();

Quindi list dovrebbe avere l'array list desiderato, tuttavia assume un valore null e non riesco a capirne il perchè. Ho eseguito il debug inserendo dei break point nei punti indicati con i commenti asterisco * e **.
Eseguendo le due righe di codice precedenti accade quanto segue; fino a che eseguo il metodo listaClienti() il debug mi fa vedere che al punto * listaClienti non è null ed è pertanto tutto regolare, effettivamente risulta che sono stati assegnati i valori contenuti nel database (e quindi a livello di DB non ci sono anomalie). Quindi, il debug procede al prossimo step andando nella classe di model per eseguire il metodo setter, qui è ancora tutto ok e listaClienti viene correttamente impostato al valore corrente. Successivamente viene eseguita nella view la riga di codice
	        ArrayList<Cliente> list = new Cliente().getListaClienti();

Il passo successivo sarà di tornare nella classe di model e, tramite il getter, restituire listaClienti, il quale sarà il valore assegnato a list. Qui accade una stranezza, dal debug mi risulta che nell'esecuzione del metodo getter listaClienti è null, pertanto list sarà altrettanto.
Come mai appena prima (nel setter) listaClienti era stato assegnato correttamente, subito dopo nell'acquisirlo con il getter è risultato null? Sembra come se nella fase successiva listaClienti è stato "azzerato".

Qualcuno potrebbe aiutarmi? Scusate il linguaggio un pò poco tecnico, ma sto agli inizi, in ogni caso grazie mille.

Risposte
CaMpIoN
Da come ho capito hai due classi: Cliente e ClienteDAO (lo capisco dal costruttore che usi). Nella classe Cliente probabilmente hai dichiarato un'attributo di tipo ArrayList, così come anche in ClienteDAO. Logicamente hai per ogni oggetto Cliente un'ArrayList, e altrettanto per ogni oggetto ClienteDAO.
Effettivamente
new ClienteDAO().listaClienti();

ritorna un'ArrayList, tuttavia non ce nessuna assegnazione, perché le assegnazioni si effettuano con il simbolo = e precedute dal nome della variabile a cui vuoi assegnare il risultato.
Quindi dovresti avere qualcosa come
ArrayList<Cliente> listaclienti = (new ClienteDAO()).listaClienti();

Inoltre essendo Cliente e ClienteDAO due classi diverse, l'ArrayList della classe ClienteDAO è diverso da quello che hai (presubilmente) dichiarato nella classe Cliente, pertanto pure se usi il codice scritto sopra, non ti setta l'attributo ArrayList di Cliente con l'ArrayList di ClienteDAO, almenochè non lo fai esplicitamente con l'oggetto ClienteDAO.
Poi la logica è sbagliata, hai ClienteDAO che deve avere l'ArrayList, Cliente è un elemento di questo ArrayList, pertanto non ha senso creare un'ArrayList di oggetti di tipo Cliente in un oggetto Cliente.
Potrei ipotizzare pure che hai dichiarato l'ArrayList di Cliente come statico, e quindi condivisibile tra tutti gli oggetti di tipo Cliente, e per questo restituisce null e non viene lanciata un'eccezione, perché viene inizializzata a null (le variabili statiche
vanno inizializzate) ma anche questa logica di programmazione è sbagliata (anche se possibile).
Ad ogni modo credo che tu voglia realizzare la struttura del programma seguendo il pattern MVC. Devi però distinguere i Model semplici da quelli DAO nel caso di interfacciamento a db. I Model semplici devono solo definire le entità del db, quelli che gestiscono degli ArrayList devono essere altri tipi di Model.

Il metodo eseguiQuery lo hai creato tu giusto?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.