Restituisce la lista clonata e getSize

0
class A{
    private List<Item> itemsList;       

    public List<Item> getClonedItemsList{
        return new ArrayList<Item>(itemsLIst);
    }

    public int getItemsCount{
        return itemsList.size();
    }
}

Ha senso avere entrambi i metodi in questa classe? Ottenendo un clone della lista, anche i clienti della mia classe possono ottenere le sue dimensioni. D'altro canto, altri clienti potrebbero non voler clonare l'elenco di elementi e potrebbero interessarsi solo di quanti elementi ci sono nell'elenco.

    
posta user4205580 11.04.2016 - 10:39
fonte

4 risposte

3

Perché i clienti hanno bisogno di un clone della lista? Il problema qui è che la clonazione di una lista è un'operazione costosa, che non si desidera eseguire inutilmente. Ma ci sono altre possibili soluzioni, tra cui la restituzione di un wrapper di sola lettura dell'elenco o l'utilizzo di un elenco immutabile nella classe stessa. Queste possibilità dovrebbero essere esaminate per prime, e l'ottimizzazione di includere un metodo get size viene presa in considerazione solo se non funzioneranno altre possibilità.

    
risposta data 11.04.2016 - 11:35
fonte
2

La tua copia delle liste è un esempio di copia difensiva . In questo modo, il tuo cliente ottiene una copia dell'elenco gestito e, in quanto tale, non cambierà sotto di essi mentre stanno ripetendo (per esempio) su questo. Tieni presente che la semplice fornitura di un wrapper di sola lettura a una raccolta impedisce al tuo client di manipolare l'elenco, ma non che la stessa lista possa essere modificata con altri mezzi.

La copia difensiva può essere una buona pratica da utilizzare in tali casi in cui un client utilizzerà una raccolta / oggetto che un'altra entità può modificare simultaneamente.

È un'operazione costosa? Questo dipende dalle dimensioni e dall'uso della collezione. In quanto sopra suppongo che tu stia usando Java, e in quanto tale copia copi solo i riferimenti, nel qual caso la spesa può essere ridotta (ma non dimenticare che potresti volere assicurarti che gli oggetti di riferimento non possano / non lo faranno mutare)

    
risposta data 11.04.2016 - 12:09
fonte
0

Non penso che sia necessario disporre di un metodo aggiuntivo per ottenere il conteggio. La proprietà count è una preoccupazione della ArrayList piuttosto che della classe A. I client possono sempre utilizzare la proprietà size su ArrayList per trovare il conteggio.

Se hai qualche caso d'uso che ti obbliga a restituire un valore diverso da quello che restituisce il metodo della dimensione su ArrayList, allora ha senso creare il metodo di conteggio

    
risposta data 13.04.2016 - 09:23
fonte
0

Considera che il valore di ritorno di getItemsCount potrebbe essere diverso dal numero degli elementi nella lista clonata specialmente in un ambiente multithread ... Potresti avere la necessità di controllare la dimensione dell'elenco reale invece di quella clonata in modo da potrebbe avere senso avere entrambi i metodi.

    
risposta data 13.04.2016 - 10:59
fonte

Leggi altre domande sui tag