我最近多次遇到这种情况:
- 一个类有一个不可变的(索引的?)序列成员
- 工厂成员方法创建一个新实例,其序列有所修改
有什么有效的方法来做到这一点?
class A( xs: IndexedSeq[Int] ) {
def another: A = {
val ys = xs.toArray.clone() // !!!
ys(7) = 13
new A(ys)
}
}
我这样做 .toArray 以便我可以修改这个序列和 .clone 因为我担心如果原始 xs 已经是一个数组,toArray 将只返回这个,我将修改对象(意味着是不可变的) 值。但是,如果 xs 不是数组,这显然会产生两个副本,我真的很想避免这种情况。显然,我可以只检查它的类型,但这似乎很不雅,我不太确定是否必须检查其他可以包装数组的可变序列。做什么?
scala> val xs: Seq[Int] = Array(1, 2, 3)
ss: Seq[Int] = WrappedArray(1, 2, 3)
scala> val ys = xs.toArray
ys: Array[Int] = Array(1, 2, 3)
scala> ys(1) = 22
scala> ys
res1: Array[Int] = Array(1, 22, 3)
scala> xs
res2: Seq[Int] = WrappedArray(1, 22, 3)