有人曾告诉我,所有公共领域,根据语言的性质自动包装在吸气剂和制定者中。而且我相信,直到我在IDEA的intellisense中检查了那种。
所以说我们有一个简单的类
class Something {
val a = 5
}
然后写(new Something).
IDEA会将a
显示为值。
然而,相反,在Eclipse中执行完全相同的操作,a
将显示为def
,这使我成为这里的围栏。
哪一个正确?值是否在编译时包含在函数中,而IDEA只是令人困惑?或者它只是一个价值/变量而且我一直都弄错了?
答案 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