大数据Scala编程.问题集(01)
高老师陪您成长...
by 高焕堂
洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师
微博:@高焕堂_台北
Q-01: 如何使用Scala的Singleton机制来表达Class-level的数据。
Answer:
在面向对象编程(OOP,Object-Oriented Programming)概念里,属性(Attribute)和函数(Function)都分为两个不同级别(Level)。例如,厦门的科技谷(厦门)公司的大数据平台上,含有各航空公司的飞机数据,包括:东方航空(CEA,ChinaEasternAirlines)、南方航空(CSA, ChinaSouthernAirlines)、长荣航空(EVA, EvergreenAirlines)等公司的飞机数据。
于是,Scala程序员的脑海里,想到长荣航空公司有许多架飞机在天空上飞,或者在机场停机平等待客人等。
每一架飞机都是一个实例(Instance)。人类天赋就有抽象的能力,于是从实例中抽象出概念(Concept):长荣航空飞机(EVAPlane)。
Scala程序员将上述领域(或业务)概念,对应到软件代码的类(Class),得到一个EVAPlane类:
兹以UML图形表示这个类:
一谈到类(Class),就会联想到有两种对象:
1) 类对象(Class object):<长荣航空飞机>类(概念)可以对应到一个对象,它又称为妈妈对象(Meta object),可担任创建实例(小孩)对象(Instance object)的任务。
2) 实例对象(Instance object):每一架长荣飞机都是一个实例,各对应到一个对象,这是大家熟悉的对象了。
在软件执行时,会创建上述的两种对象,每一个对象都需要占用一块内存(Memory)空间。
为了让计算机在执行时,能创建上述这两种对象,程序员就必须撰写Scala代码来指示计算机。其代码结构如下:
于是可看出来,无论属性或函数都分为两个级别:
l Instance-level(实例级别或称对象级别):这是一般大家都知道的,例如每一架飞机都是一个实例或对象,各自都有它的厂牌、载客量、年龄等属性数据。这些数据值都储存于(内存的)实例对象里。
l Class-level(类级别):例如,<长荣航空飞机>类的目前实例总数,是重要的属性数据值,它不属于某一架飞机(实例)的属性数据,而是属于整个<长荣航空飞机>类的属性数据。这相当于在问:EVAPlane类目前在内存里共创建了多少个实例对象呢?像这种数据,必须储存于上图的类对象里,这称为Class-level的属性数据。
既然有了Class-level的属性,为了存取(Access)这种属性的数据值(Value),当然我们就会定义某些函数来存取或处理之。这种函数,就称为Class-level的函数或方法了。
// Instance-level 属性和函数的定义
class EVA Plane{
var manufacturer : String = ""
var capacity : Int = 0
var mfr_date : String = ""
def pr_capacity {
println(capacity)
}
EVA Plane.inrc_amt
}
// Class-level 属性和函数的定义
object EVAPlane {
var instance_amount : Int = 0
def apply() = new EVAPlane
def incr_amt {
instance_amount = instance_amount + 1
}
def pr_amt {
println(instance_amount)
}
}
// myApp
object myApp {
def main( args: Array[String] ) {
val a1 = EVA()
val a2 = EVA()
val a3 = EVA()
EVA.pr_amt
}
其中的capacity是Instance-level属性,pr_capacity是Instance-level函数。而instance_amt是Class-level属性,而pr_amt是Class-level函数。在执行这个程序时,首先载入(Load)代码到内存(Memory),让JVM来执行之。
当执行到指令: val a1 = EVAPlane(),此时先执行等号(=)右边的EVAPlane(),就载入(Load)上数代码,立即拿object EVAPlane定义(做为模板)来创建一个类对象。
也就是说,EVAPlane类本身就是一个对象,所以就创建一个VEAPlane类对象,来储存EVAPlane类有关的属性(数据)值。例如,定义一个instance_amt属性来纪录目前EVAPlane类共创建了多少个实例对象。接着执行到apply()函数里的指令:new EVAPlane,就拿class EVAPlane定义(做为模板)来创建一个实例对象,用来储存一架长荣飞机的属性值。
同时执行class EVAPlane的构造式(Constructor)来设定实例对象的初值,并且将其类对象的instance_amt值加1,表示增加了一个实例对象。
继续执行到:
val a2 = EVA()
val a3 = EVA()
就多创建了2个EVAPlane的实例对象,并更新了EVAPlane类对象里的instance_amt值。
此时,在内存里共有4个对象,包括1个EVAPlane类对象,以及3个EVAPlane实例对象(上图里的a1, a2和a3)。以上,藉由长荣航空的例子,说明Scala语言如何表达Instance-level属性和函数,以及表达Class-level属性和函数。
��^�m�W�:高老��的相�P��l
相关文章:大数据Scala编程问题集(02)
相关文章:大数据Scala编程问题集(03)
~ end ~