变量和val的Scala内部

Vik*_*dya 4 scala

Scala中var和val的内部实现是什么?有兴趣知道他们的实现的细节 - 是什么使var变为"var"如何实现可变结构vs val(更像是最终的)结构,这使得它是不可变的.

Dyl*_*lan 12

我将通过示例回答,使用scalacjavap.

首先我创建Test.scala:

class Test {
  val x = 1
  var y = 2
}
Run Code Online (Sandbox Code Playgroud)

通过scalac Test.scala生成编译它Test.class,然后javap -p Test.class用来获取

public class Test {
  private final int x;
  private int y;
  public int x();
  public int y();
  public void y_$eq(int);
  public Test();
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它val x成为了private final类中的一个字段,也是一个public final返回该值的方法.

var y成为一个非最终的私人领域,以及一个吸气者+二传手.这y_$eq(int)是制定者.在scala中,那就是def y_=(newY: Int): Unit.Scala的语法糖将转化y = someValue为调用y_=(someValue).