用val声明一个类的实例

时间:2014-11-02 09:43:36

标签: class scala immutability

在Scala中,val关键字声明了一个不可变的变量。因此,如果您声明val x = 3,则它会保持为3.但如果您使用var,则可以更改。{/ p>

但是如果用val声明一个类的实例会怎样?例如,参加此课程Point

   class Point(_x: Int, _y: Int) {
       var x = _x
       var y = _y

       def doubleValues = {
           x *= 2
           y *= 2
       }
   }

首先,我宣布var location = new Point(2,2) 然后运行

  println(location.x)
  println(location.y)

  location.doubleValues

  println(location.x)
  println(location.y)

正如预期的那样,输出是

2
2
4
4

但如果我重新运行并使用val关键字来声明位置,结果是相同的。因此即使location被声明为不可变,其中的可变变量仍然是可变的。

那么当你用val声明一个类的实例时会发生什么?使用varval之间有什么区别?

2 个答案:

答案 0 :(得分:3)

使用var,您可以更改Point;使用val,您无法

var x = new Point(2, 2)
x = new Point(3, 2)
val y = new Point(2, 2)
y = new Point(3, 2) // won't compile

相反,如果我创建一个包含val的对象,我就无法更改该值"内部"对象,即使我可以改变对象本身:

class Q(i: Int) {val x: Int = i}
var q = new Q(4)
q = new Q(6)
q.x = 2 // won't compile

要使对象真正不可变,您需要使用val"一直向下"。一个常见的模式是拥有你所有的"内部"对象不可变,然后有一些"顶级"可变的对象,可以是显式的(使用var),也可以使用像State monad这样的东西。拥有"不可变的"的价值相对较小。具有可变成员的对象。

答案 1 :(得分:0)

指向对象的指针是不可变的,而不是对象本身。