Scala中无显式实例构造器的实例变量初始化疑问
关于Spark EdgeTriplet类中srcAttr和dstAttr的疑问解答
1. srcAttr和dstAttr是否为实例变量?
是的,这两个用var关键字定义的变量属于实例变量。在Scala中,直接在类体中声明的var/val默认是类的实例成员,每个EdgeTriplet实例都会拥有独立的srcAttr和dstAttr副本,并非类级别的静态变量。
2. 初始化这些变量的构造器在哪里?
Scala的类主构造器与类定义本身绑定在一起:
- 你看到的
class EdgeTriplet[VD, ED] extends Edge[ED]就是该类的主构造器定义,类体中所有未嵌套在方法、内部类中的代码(包括这两个变量的定义)都会成为主构造器的执行逻辑。 - 代码里的
var srcAttr: VD = _是Scala的默认初始化语法:下划线_会根据泛型类型VD自动赋予对应默认值——引用类型为null,数值类型为0,布尔类型为false。注释中的nullValue[VD]是Spark内部工具方法,作用和这个下划线初始化逻辑一致,用于给泛型类型生成合法默认值。
额外补充:虽然代码显示的是默认初始化,但在GraphX的实际运行流程中,这两个变量会在EdgeTriplet实例创建后,由GraphX内部的顶点属性关联、分区数据加载等逻辑填充真实的顶点属性值,不会一直保留默认初始值。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

