Ho implementato una classe in Java che, internamente, memorizza un elenco. Voglio che la lezione sia immutabile. Tuttavia, ho bisogno di eseguire operazioni sui dati interni che non hanno senso nel contesto della classe. Quindi, ho un'altra classe che definisce un insieme di algoritmi. Ecco un esempio semplificato:Oggetti immutabili in Java e accesso ai dati
Wrapper.java
import java.util.List;
import java.util.Iterator;
public class Wrapper implements Iterable<Double>
{
private final List<Double> list;
public Wrapper(List<Double> list)
{
this.list = list;
}
public Iterator<Double> iterator()
{
return getList().iterator();
}
public List<Double> data() { return getList(); }
}
Algorithm.java
import java.util.Iterator;
import java.util.Collection;
public class Algorithm
{
public static double sum(Collection<Double> collection)
{
double sum = 0.0;
Iterator<Double> iterator = collection.iterator();
// Throws NoSuchElementException if the Collection contains no elements
do
{
sum += iterator.next();
}
while(iterator.hasNext());
return sum;
}
}
Ora, la mia domanda è: esiste un modo affidabile per evitare che qualcuno modifica i miei dati interni nonostante il fatto che la mia classe sia destinata a essere immutabile? Mentre Ho fornito un dato () metodo per scopi di sola lettura, non c'è nulla per impedire a qualcuno di modificare i dati tramite metodi come chiaro() e remove(). Ora, mi rendo conto che potrei fornire l'accesso ai miei dati esclusivamente tramite iteratori. Tuttavia, mi è stato detto che è tipico passare una collezione . In secondo luogo, se avessi un algoritmo che richiede più di un passaggio sui dati, dovrei fornire più iteratori, il che sembra una pendenza scivolosa.
Ok, si spera che ci sia una soluzione semplice che risolverà le mie preoccupazioni. Sto solo tornando in Java e non ho mai considerato queste cose prima di occuparmi di const in C++. Grazie in anticipo!
Oh! C'è un'altra cosa a cui ho appena pensato. Non posso praticamente restituire una copia dell'interno Elenco. L'elenco nell'elenco contiene in genere centinaia di migliaia di elementi.
Perfetto! Non l'ho visto. Grazie. –
Devi ancora occuparti del modo in cui viene creato l'oggetto Wrapper: poiché l'elenco viene passato al costruttore, potrebbero esserci dei riferimenti ad esso nel codice. Se vuoi che Wrapper sia veramente immutabile, dovrai copiare il contenuto della lista. –