【发布时间】:2012-11-21 06:00:07
【问题描述】:
我有一个带有私有字段的类,它是一个可变集合。这个特定实例中的字段是ArrayBuffer,尽管我的问题扩展到任何有限、有序、随机访问的集合类型。我想公开这个字段而不允许其他人修改它。在 Java 中,我会添加如下方法:
private List<T> theList;
public List<T> getList() {
return Collections.unmodifiableList(theList);
}
在 Java 中,我们只接受结果是 List,它没有完全实现 List 接口,因为 #add 和朋友抛出 UnsupportedOperationException。
在 Scala 中,我希望找到一个合适的特征,其中包含 iterator、size 和 apply(用于按索引检索值)等访问器,但没有修改器。有没有我还没有发现的这种类型?
【问题讨论】:
-
是你想要的
.toVector方法吗?它将以Vector的形式返回ArrayBuffer中值的副本,该Vector是不可变的并支持快速随机访问。 (.toVector仅在 Scala 2.10 中,对于 2.9.2,您可以执行类似Vector() ++ myArrayBuffer的操作) -
集合大小可能在几万。这足以证明我对不可变集合复制的反感吗?
-
您的 Java 示例不会生成不可变列表。它只是在不可变的包装器中隐藏了一个可变列表。任何保留对底层列表的引用的对象仍然可以对其进行变异...如果对您来说足够了,您可以轻松实现相同的方法...
-
是的,我说的是“不可修改”而不是“不可变”,并明确引用了在 java.util.List 上执行此类操作的方法,因为这正是我正在寻找的行为为。