Ich habe eine Klasse in Java implementiert, die intern eine Liste speichert. Ich möchte, dass die Klasse unveränderlich ist. Ich muss jedoch Operationen an den internen Daten durchführen, die im Kontext der Klasse nicht sinnvoll sind. Daher habe ich eine andere Klasse, die eine Reihe von Algorithmen definiert. Hier ist ein vereinfachtes Beispiel:unveränderliche Objekte in Java und Zugriff auf Daten
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;
}
}
Nun, meine Frage ist, gibt es eine zuverlässige Methode, um jemanden zu verhindern, Modifizieren meine internen Daten trotz der Tatsache, dass meine Klasse unveränderlich sein soll? die Daten über Methoden zu modifizieren, wie clear() und remove() Während ich ein Daten() Methode für Nur-Lese-Zwecke zur Verfügung gestellt haben, gibt es nichts, jemanden zu stoppen. Jetzt weiß ich, dass ich meine Daten ausschließlich über Iteratoren zugänglich machen kann. Allerdings wurde mir gesagt, dass es typisch ist, eine Collection zu bestehen. Zweitens, wenn ich einen Algorithmus hätte, der mehr als einen Durchlauf über die Daten erfordert, müsste ich mehrere Iteratoren bereitstellen, was wie ein rutschiger Abhang aussieht.
Okay, hoffentlich gibt es eine einfache Lösung, die meine Bedenken lösen wird. Ich komme gerade zurück in Java und habe nie über diese Dinge nachgedacht, bevor ich mich in C++ mit const beschäftigt habe. Danke im Voraus!
Oh! Da ist noch eine Sache, an die ich gerade gedacht habe. Ich kann praktisch keine Kopie der internen Liste zurückgeben. Die Liste enthält normalerweise Hunderttausende von Elementen.
Perfekt! Ich habe das nicht gesehen. Vielen Dank. –
Sie müssen immer noch auf die Art und Weise achten, wie das Wrapper-Objekt erstellt wird: Da die Liste an den Konstruktor übergeben wird, kann es an anderer Stelle im Code Verweise darauf geben. Wenn Wrapper wirklich unveränderbar sein soll, müssen Sie den Inhalt der Liste kopieren. –