Java/Array: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m →‎Tipi array: rimuovo: superfluo
Riga 158:
 
=== Array o Collection? ===
Un array ha la stessa identica funzionalità di una [http://download.oracle.com/javase/6/docs/api/java/util/List.html java.util.List] di dimensioni costanti e che supportafornisca leaccesso operazioni diin lettura e scrittura degli elementi.
 
La scelta fra un tipo array e una List (o altra [http://download.oracle.com/javase/6/docs/api/java/util/Collection.html Collection]) è arbitraria e lasciata al programmatore.
 
Se si sta progettando l'implementazione privata di una classe o il corpo di un metodo, non c'è motivo di porsi il problema, perché, in futuro, si potrà tornare indietro sulla decisione con modifiche che resteranno sempre circoscritte.
In genere, non vale la pena di scegliere un tipo array al posto di una List ''solo'' per ottimizzare il codice che accede agli elementi della List, cioè per evitare le invocazioni ai metodi <code>get</code> e <code>set</code>: le macchine virtuali odierne adottano internamente delle tecniche di ottimizzazione (come l'<nowiki/>''inlining'' dei metodi di ridotte dimensioni) che rendono superfluo un accorgimento come questo. Inoltre, la classe [http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html java.util.ArrayList] ha prestazioni decisamente buone per la maggior parte delle applicazioni in cui sia necessario disporre di una lista ad accesso casuale.
 
InNegli altri casi, in genere, non vale la pena di scegliere un tipo array al posto di una Listcollezione, se l'<nowiki/>'solo'unica'' perragione è ottimizzare il codice che accede agli elementi dellaalle Listcelle, cioè per evitareusare l'accesso diretto alla memoria come "scorciatoia" che eviti le invocazioni aidei metodi <code>get</code> e <code>set</code>:. Infatti, le macchine virtuali odierne adottano internamente delle tecniche di ottimizzazione (come l'<nowiki/>''inlining'' dei metodi di ridotte dimensioni ridotte) che rendono superfluo un accorgimento come questo. Inoltre, la classe [http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html java.util.ArrayList] haesibisce buone prestazioni decisamente buone per la maggior parte delle applicazioni in cui sia necessario disporre di una lista ad accesso casuale, e la classe [http://download.oracle.com/javase/7/docs/api/java/util/LinkedList.html java.util.LinkedList] è sicuramente più facile da usare di un array nel caso sia necessario uno [[w:it:stack|stack]] o una [[w:it:Coda (informatica)|coda]].
Nella scelta si deve tenere conto anche del fatto che List è un'interfaccia, quindi un client può implementare una propria versione di List che esegua codice personalizzato in risposta all'invocazione di alcuni dei suoi metodi. Ad esempio, un'implementazione può gestire una coda di [http://download.oracle.com/javase/6/docs/api/java/util/EventListener.html java.util.EventListener]s notificati ogni volta che la lista subisce un cambiamento; oppure si possono adottare alcune delle implementazioni fornite dalla classe [http://download.oracle.com/javase/6/docs/api/java/util/Collections.html java.util.Collections]; ecc. Insomma, lo strato di astrazione fornito dall'interfaccia List permette di riutilizzare il codice, se in futuro dovessero presentarsi nuove esigenze da parte di qualche client, sfruttando un "punto di accesso" tramite il quale si possono inserire delle implementazioni personalizzate della propria lista con una modifica minima al codice originale<ref>Anzi, se il codice è stato scritto bene, non è necessario modificare il codice originale, ma solo il client, e anche in quest'ultimo, nel migliore dei casi, è sufficiente modificare una sola riga di codice</ref>. Questo non è possibile se si usano gli arrays.
 
Nella scelta si deve tenere conto anche del fatto che lo strato di astrazione aggiuntivo permette ai client di fornire una implementazione personalizzata, e ciò rende la struttura a oggetti più resistente nei confronti delle eventuali modifiche future che potrà essere necessario implementare nel programma. In certi casi, una collezione personalizzata permette di risparmiare memoria, in quanto non tutto il contenuto deve risiedere in memoria. Si pensi ad una lunga sequenza di elementi uguali tra loro: in alternativa, si può conservare una sola copia del valore, e simulare una collezione di grandi dimensioni manipolando gli indici.<ref>Per maggiori informazioni, vedi [http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#nCopies(int, T) java.util.Collections.nCopies()]</ref> Un'altra implementazione può accedere direttamente alle proprietà di un oggetto o ai campi di un database, mascherandolo dietro l'interfaccia della collezione, invece di utilizzare la memoria come passaggio intermedio (e obbligatorio) per la memorizzazione dei dati.
 
== Note ==