Это действительно зависит от того, нужно ли вам широко распространять эту коллекцию. Преимущество изменяемой коллекции заключается в том, что она обычно быстрее, чем неизменяемая коллекция, и проще иметь один объект для передачи, чем нужно убедиться, что вы можете установить переменную из разных контекстов. Но поскольку они могут измениться из-под вас, вы должны быть осторожны даже в однопоточном контексте:
import collection.mutable.ArrayBuffer
val a = ArrayBuffer(1,2,3,4)
val i = a.iterator
i.hasNext // True
a.reduceToSize(0)
i.next // Boom!
java.lang.IndexOutOfBoundsException: 0
at scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:43)
...
Поэтому, если он будет широко использоваться, вам следует подумать, можно ли быть достаточно осторожным, чтобы избежать подобных проблем. Обычно безопаснее использовать var
для неизменяемой коллекции; тогда вы можете устареть, но, по крайней мере, вы не упадете лицом вниз с ошибкой.
var v = Vector(1,2,3,4)
val i = v.iterator
i.hasNext // True
v = Vector[Int]()
i.next // 1
Однако теперь вы должны передать v
в качестве возвращаемого значения из любого метода, который может его изменить (по крайней мере, за пределами класса, который его содержит). Это также может вызвать проблемы, если вы забудете обновить исходное значение:
var v = Vector(1,2,3,4)
def timesTwo = v.map(_ * 2)
timesTwo
v // Wait, it's still 1,2,3,4?!
Но тогда и это не обновляется, не так ли ?:
a.map(_ * 2) // Map doesn't update, it produces a new copy!
Итак, как правило,
- Производительность требует, чтобы вы использовали один - используйте его
- Локальная область видимости внутри метода - используйте изменяемую коллекцию
- Совместно с другими потоками / классами - используйте неизменяемую коллекцию
- Реализация внутри класса, простой код - используйте изменяемую коллекцию
- Реализация внутри класса, сложный код - используйте неизменяемый
но вам, вероятно, следует нарушать это так часто, как вы его придерживаетесь.
person
Rex Kerr
schedule
23.07.2013
val misterMutableCollection = collection.mutable....
- person om-nom-nom   schedule 23.07.2013