二、Scala中的Object实战详解 |
object
定义一个类同名的object对象,里面存放静态的成员或者方法,把该object对象称之为该类的伴生对象。
图3
在图3中,SparkContextobject为SparkContext类的伴生对象,里面存放一系列静态的成员和静态的方法。而且,当我们第一次
调用SparkContext时,SparkContext伴生对象会被执行一次,仅此一次。下面是一个示例:
图4
图4中object Person是class Person的伴生对象,class Person称之为object Person的伴生类。伴生对象适合在里面定义一些工具方法,以及存放一些全局唯一的常量,节省空间。
//第一次调用:Person伴生对象的getSalary方法
//此时,我们发现:Person伴生对象被初始化,打印出字符串Scala。
scala> Person.getSalary
Scala
res34: Double = 0.0
//第二次调用:Person伴生对象的getSalary方法
//此时,我们发现:Person伴生对象不再需要初始化,没有打印出字符串Scala。
scala> Person.getSalary
res35: Double = 0.0
以上示例中确实验证了:伴生对象会被执行一次,仅此一次。
Scala中,我们在定义类的对象时, 一般都不会用new类名,再传入参数的方式来定义。而是直接用类名,或者类名加参数的方式。例如,我们重温下面的示例:
我们构造一个数组,其实是调用Array的伴生对象object Array的apply方法。
scala> val array=Array(1,2,3)
array: Array[Int] = Array(1, 2, 3)
scala> val array=Array.apply(1,2,3)
array: Array[Int] = Array(1, 2, 3)
以上两种定义数组的方式效果是一样的。apply方法就是当前类的伴生对象的工厂方法。延伸一下,Java水平比较高的编程人员,在构造Java对象时,一般来说不会直接new一个类,而是通过工厂方法模式来创建。而Scala语言中,天生就支持这次模式,所以在具体类对象构造时,一般都是在伴生类的伴生对象的apply方法中去实现!这样可以控制对象的生成。