我已经用 Java 实现了一个类,它在内部存储了一个List。我希望这个类是不可变的。但是,我需要对在类上下文中没有意义的内部数据执行操作。因此,我有另一个类定义了一组算法。这是一个简化的示例:
包装器.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(); }
}
算法.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,在处理C++ 中的const之前从未考虑过这些事情。提前致谢!
哦!我刚刚想到的还有一件事。我实际上无法返回内部List的副本。该列表通常包含数十万个元素。