Scala中Graph抽象类与伴生对象apply方法的关联及调用机制
关于GraphX中Graph伴生对象apply方法的解答
1. 伴生对象apply方法与Graph抽象类的关系
在Scala中,伴生对象和对应的类(此处为抽象类Graph)是紧密绑定的:二者可互相访问对方的私有成员,且伴生对象常被用来实现工厂模式——因为抽象类无法直接实例化,伴生对象的apply方法会负责创建并返回该抽象类的具体子类实例,对外屏蔽底层实现细节。
2. 此处并未调用Graph抽象类的构造方法
抽象类本身不能被实例化,所以你写的Graph(verticesRDD, edgesRDD)根本没有调用Graph抽象类的构造方法。实际上,伴生对象的apply方法内部会创建Graph的具体子类实例(比如GraphX中的私有实现子类Impl),再将这个实例返回给你。
3. apply方法不是构造方法
apply只是伴生对象中的普通方法,只是Scala提供了语法糖:当你写类名(参数)时,如果该类存在伴生对象且伴生对象中有匹配的apply方法,就会自动调用类名.apply(参数)。所以Graph(verticesRDD, edgesRDD)本质是Graph.apply(verticesRDD, edgesRDD)的简写,和构造方法调用完全是两回事。
举个Scala基础示例类比:
abstract class MyAbstractClass object MyAbstractClass { def apply(): MyAbstractClass = new MyAbstractClass {} // 创建匿名子类实例 } // 调用时 val obj = MyAbstractClass() // 等价于MyAbstractClass.apply()
这个逻辑和GraphX中的实现完全一致。
内容的提问来源于stack exchange,提问作者morgan
相关产品推荐
相关产品推荐

