Scala编程问题集(01)

By 高焕堂

洞庭国际智能硬件检测基地

Q-01: 如何使用Scala的Singleton机制来表达Class-level的数据。

Answer:

在面向对象编程(OOP,Object-Oriented Programming)概念里,属性(Attribute)和函数(Function)都分为两个不同级别(Level)。例如,厦门的科技谷(厦门)公司的大数据平台上,定义了数百个航空公司的类(Class),包括:东方航空公司(ChinaEasternAirlines)、南方航空公司(ChinaEasternAirlines)、长荣航空公司(EvergreenAirlines)等等。其中,每一架飞机都是一个实例(Instance)或称对象(Object)。于是可看出来,无论属性或函数都分为两个级别:

  • Instance-level(实例级别或称对象级别):这是一般大家都知道的,例如每一架飞机都是一个实例或对象,各自都有它的厂牌、载客量、年龄等属性数据。
  • Class-level(类级别):例如,长荣航空公司的飞机数量,是重要的属性数据,但不是某一架飞机(Instance)的属性数据,而是属于整个EvergreenAirlines类的属性数据。当我们再问:长荣航空公司的飞机数量时,常常相当于在问:EVA(EvergreenAirlines)类目前共创建了多少个对象(实例)呢?像这种数据,就称为Class-level的属性数据。

既然有了Class-level的属性,为了存取(Access)这种属性的数据值(Value),当然我们就会定义某些函数来存取或处理之。这种函数,就称为Class-level的函数或方法了。

// Instance-level 属性和函数的定义 

class EVA {

var manufacturer : String = ""

var capacity : Int = 0

var mfr_date : String = ""

def pr_capacity() {

println(capacity)

  }

// Class-level 属性和函数的定义 

object EVA {

var instance_amount : Int = 0

def apply() {

instance_amount = instance_amount + 1

return new EVA

}

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),让VM来执行之。

当执行到指令: val a1 = EVA(),此时先执行等号(=)右边的EVA(),拿object EVA定义来创建一个对象,来表达EVA类本身,也就是说,EVA类本身就是一个对象,所以就创建一个VEA类的对象,来储存EVA类有关的属性(数据)值。例如,定义一个instance_amt属性来纪录目前EVA类共创建了多少个对象(长荣航空有多少架飞机)。

接着执行到apply()函数,拿class EVA定义来创建一个对象,来表达一架长荣飞机,记录该架飞机的属性值。并且,将EVAobj的instance_amt值加1,表是长荣航空增加了一架飞机。

继续执行到:

     val a2 = EVA()

val a3 = EVA()

就创建更多的<长荣飞机>对象,并更新了<长荣飞机类>对象里的instance_amt值。

此时,在内存里共有4个对象,包括1个<EVA类>(本身的)对象,以及3个<EVA实例>对象(如上图里的a1, a2和a3)。以上,藉由长荣航空的例子,说明Scala语言如何表达Instance-level属性和函数,以及表达Class-level属性和函数。

~ end ~

时间: 2024-10-28 09:15:03

Scala编程问题集(01)的相关文章

大数据Scala编程.问题集(03)

by 高焕堂 洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师 微博:@高焕堂_台北 Q-03: 如何从TemplateMethod设计模式理解trait的两项接口? Answer: Scala的trait就是接口类(Interface class),其意味着,它的结构是抽象类,但其扮演接口的角色.通常,可从有两个不同视角去看待trait机制: l 第一个视角:将trait对应到Java的"Interface"机制.此时,将trait看成一个接口(主要是抽象函

大数据Scala编程.问题集(02)

by 高焕堂 洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师 微博:@高焕堂_台北 Q-02: Scala语言的trait具有什么设计涵意? Answer: 大家都知道接口(Interface)的概念,也知道一个类(Class)或一个模块(Module)能实现多个接口.就像一个房间可以有多个门,或一座四合院可以有多个门口一样.如下图: 将四合院的概念对应到软件上,一个软件的类可以实践多个接口,如下图: 现在,先拿一个类和一个接口的设计架构来看看,如下图: 在一般软件设计上,接

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

Spark2.0从入门到精通:Scala编程、大数据开发、上百个实战案例、内核源码深度剖析视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

【Scala编程】函数式风格编写排序算法

有关Scala编程实例 在刚开始学习一门编程语言的时候,总是想去写一些比较大的程序和项目,但是由于基础不扎实,往往欲速则不达.所以,只能一步一步来,通过一些经典的小例子来实践和锻炼,最终不断加深编程的技能,坚持下来,相信慢慢就能够变得熟练. 冒泡排序.选择排序.插入排序的一般写法 这三种排序方法没有太多要说的东西,这里的编程方式和指定式方式没什么差别. 这里之所以使用Array数据,因为Array数组是可变的对象序列,其元素值可以改变,而List类对象的元素是不可变的. 这里的写法不是函数式风格

Scala 编程(一)

Scala 简介 Scala 属于“可伸展语言”,源于它可以随使用者的需求而改变和成长.Scala 可以应用在很大范围的编程任务上,小到脚本大到建立系统均可以. Scala 跑在标准 Java 平台上,可以与所有 Java 库实现无缝交互.它把面向对象和函数式编程理念加入到静态类型语言中.Scala可以培育新的类型和新的控制结构,使它用起来更像是内建的类型和控制结构一样,它没有提供所有你在一种“完美齐全”语言中可能需要的东西,而是把制作这些东西的工具放在了你的手中. Scala 编程总览 Sca

编程题集

编程题集 ps: 如题目有错请及时反馈 2015/7/10    scanf.printf的基本用法.变量的定义和使用.C语言的各种运算符 ------------------------------------------------------------------------------------- 程序篇: #1编写一个程序,输出 "Hello World" . #2编写一个程序,实现简单的加减乘除运算. #3让用户输入两个整数,然后调换位置后输出. #4输入年,月,日,把

Scala编程进阶

跳出循环语句的3种方法... 1 多维数组... 2 Java数组与Scala数组缓冲的隐式转换... 2 Java Map与Scala Map的隐式转换... 3 Tuple拉链操作... 3 内部类的作用域:外部类对象... 3 扩大内部类作用域:伴生对象... 4 扩大内部类作用域:类型投影... 4 内部类获取外部类的引用... 4 package定义... 5 package特性... 5 import. 8     跳出循环语句的3种方法 方法一:使用boolean控制变量 whil

Scala编程基础

Scala与Java的关系... 1 安装Scala. 1 Scala解释器的使用... 2 声明变量... 2 数据类型与操作符... 2 函数调用与apply()函数... 3 if表达式... 3 语句终结符.块表达式... 4 输入和输出... 4 循环... 4 高级for循环... 5 函数的定义与调用... 5 在代码块中定义包含多行语句的函数体... 5 递归函数与返回类型... 6 默认参数... 6 函数调用时带名参数... 6 变长参数... 6 序列作为变长参数... 6