0

我最近多次遇到这种情况:

  1. 一个类有一个不可变的(索引的?)序列成员
  2. 工厂成员方法创建一个新实例,其序列有所修改

有什么有效的方法来做到这一点?

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)
4

1 回答 1

2

如果你真的不需要可变性,那么最好的办法就是要求一个不可变的序列;这样您就不必担心更改数据是否有副作用。

class A(xs: collection.immutable.IndexedSeq[Int]) {
  def another: A = {
    val ys = xs.updated(7, 13)
    new A(ys)
  }
}
于 2013-10-19T17:28:50.183 回答