Я реализовал класс на Java, который, внутри, хранит список . Я хочу, чтобы класс был неизменным. Однако мне нужно выполнить операции над внутренними данными, которые не имеют смысла в контексте класса. Следовательно, у меня есть другой класс, который определяет набор алгоритмов. Вот упрощенный пример:Неизменяемые объекты в Java и доступе к данным
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;
}
}
Теперь мой вопрос, есть ли надежный способ предотвратить кто-то изменения мои внутренние данные, несмотря на то, что мой класс должен быть неизменным? Хотя я предоставил метод () для целей только для чтения, ничто не мешает кому-либо модифицировать данные с помощью таких методов, как clear() и remove(). Теперь я понимаю, что могу предоставить доступ к своим данным исключительно через итераторы. Тем не менее, мне сказали, что типично пройти Collection. Во-вторых, если бы у меня был алгоритм, требующий более одного прохода над данными, мне пришлось бы предоставить несколько итераторов, которые кажутся скользкими.
Хорошо, надеюсь, есть простое решение, которое решит мои проблемы. Я просто возвращаюсь в Java и никогда не рассматривал эти вещи, прежде чем обращаться с const в C++. Заранее спасибо!
Oh! Еще одна вещь, о которой я только что подумал. Я не могу практически вернуть копию внутреннего Список. Список , как правило, содержит сотни тысяч элементов.
Отлично! Я этого не видел. Спасибо. – 2009-06-11 03:09:26
Вы по-прежнему должны заботиться о том, как создается объект Wrapper: поскольку List передается конструктору, в нем могут быть ссылки на него где-то еще в коде. Если вы хотите, чтобы Wrapper был действительно неизменным, вам нужно будет скопировать содержимое списка. –