val是如何不可变的?

时间:2016-10-03 16:00:10

标签: scala

我知道val不是final,除非明确声明,并且使用javap确认Scalac没有将final插入字节码。

因为编译器阻止我们编写任何试图改变它的代码,所以val是不可变的吗?

1 个答案:

答案 0 :(得分:8)

final和不变性是两个正交的概念:

val表示您无法通过在初始声明后为其赋予任何内容来更改(变异)变量:

val x = 1
x = 2 // error: reassignment to val

在JVM字节码中,它是通过创建私有成员和getter来实现的,但不是setter:

class A {
  val x = 1
}

=>

// Java equivalent of a generated bytecode
public class A {
  private final int x;
  public int x() { return x; }
  ...
}

final表示您无法覆盖子类中的val

class A {
  final val x = 1
}

class B extends A { 
  override val x = 2
}

// error: overriding value x in class A of type Int(1);
//  value x cannot override final member
如果您使用final而不是var

val会导致同样的错误。