var immutable
so với val mutable
Ngoài nhiều câu trả lời xuất sắc cho câu hỏi này. Dưới đây là một ví dụ đơn giản, minh họa những nguy cơ tiềm ẩn của val mutable
:
Các đối tượng có thể thay đổi có thể được sửa đổi bên trong các phương thức lấy chúng làm tham số, trong khi không được phép gán lại.
import scala.collection.mutable.ArrayBuffer
object MyObject {
def main(args: Array[String]) {
val a = ArrayBuffer(1,2,3,4)
silly(a)
println(a) // a has been modified here
}
def silly(a: ArrayBuffer[Int]): Unit = {
a += 10
println(s"length: ${a.length}")
}
}
Kết quả:
length: 5
ArrayBuffer(1, 2, 3, 4, 10)
Điều gì đó như thế này không thể xảy ra với var immutable
vì không được phép chuyển nhượng lại:
object MyObject {
def main(args: Array[String]) {
var v = Vector(1,2,3,4)
silly(v)
println(v)
}
def silly(v: Vector[Int]): Unit = {
v = v :+ 10 // This line is not valid
println(s"length of v: ${v.length}")
}
}
Kết quả trong:
error: reassignment to val
Vì các tham số hàm được coi val
là không được phép gán lại.