Scala会自动换字段吗?

Ele*_*fee 2 variables scala properties

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

所以说我们有一个简单的课程

class Something {
  val a = 5
}
Run Code Online (Sandbox Code Playgroud)

然后写(new Something).IDEA将显示a为一个值.

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

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

Chr*_*s K 9

正在生成一个字段和一个getter,但getter不是以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();
}
Run Code Online (Sandbox Code Playgroud)

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

javap -c Something.class 

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

>

如果我们继续将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();
}
Run Code Online (Sandbox Code Playgroud)

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

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