Scala会自动换字段吗?

时间:2014-08-14 10:30:06

标签: scala variables properties

有人曾告诉我,所有公共领域,根据语言的性质自动包装在吸气剂和制定者中。而且我相信,直到我在IDEA的intellisense中检查了那种。

所以说我们有一个简单的类

class Something {
  val a = 5
}

然后写(new Something). IDEA会将a显示为值。

然而,相反,在Eclipse中执行完全相同的操作,a将显示为def,这使我成为这里的围栏。

哪一个正确?值是否在编译时包含在函数中,而IDEA只是令人困惑?或者它只是一个价值/变量而且我一直都弄错了?

1 个答案:

答案 0 :(得分:9)

正在生成一个字段和一个getter,但是get的前缀不是get,因为它是Java中的期望。它的名称与字段相同。为了确认这一点,我们可以使用javap解析scalac生成的类文件。

first compile Something.scala
javap -p Something.class 

public class starling.launcher.utils.Something implements scala.ScalaObject {
  private final int a;
  public int a();
  public starling.launcher.utils.Something();
}

然后只是为了好玩,这里是a()的jvm字节代码,它确认它确实是一个字段的直接getter方法。

javap -c Something.class 

public int a();
  Code:
     0: aload_0       
     1: getfield      #11                 // Field a:I
     4: ireturn    

>

如果我们继续将val更改为var,则代码将更改为以下内容。其中包括一个setter方法,它具有相当“不寻常”的名称a_ $ eq。

public class starling.launcher.utils.Something implements scala.ScalaObject {
  private int a;
  public int a();          // getter method
  public void a_$eq(int);  // setter method
  public starling.launcher.utils.Something();
}

并确认a_ $ eq是一个setter方法,这是它的字节代码。

public void a_$eq(int);
  Code:
     0: aload_0       
     1: iload_1       
     2: putfield      #11                 // Field a:I
     5: return