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只是令人困惑?或者它只是一个价值/变量,我一直都弄错了?
正在生成一个字段和一个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)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |