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