1. 单例对象

Scala没有静态方法或静态字段,可以使用object来达到这个目的,对象定义了某个类的单个实例:

  1. object Account{
  2. private var lastNumber = 0
  3. def newUniqueNumber () = {lastNumber += 1; lastNumber}
  4. }

当你在应用程序中需要一个新的唯一账号时,调用Account.newUniqueNumber()即可.对象的构造器在该对象第一次被使用时调用.在本例中,Account的构造器在Account.newUniqueNumber的首次调用时执行.如果一个对象从未被使用,那么起构造器也不会被执行.

对象本质上可以拥有类的所有特性,但是不能提供构造器参数.

在Scala中可以用对象来实现:

  • 作为存放工具函数或常亮的地方
  • 高效的共享单个不可变实例
  • 需要用单个实例来协调某个服务时(参考单例模式)

2. 伴生对象

在Java中,通常会用到既有实例方法又有静态方法的类,在Scala中,可以通过类和类同名的"伴生"对象来达到同样的目的:

  1. class Account{
  2. val id = Account.newUniqueNumber()
  3. private var balance = 0.0
  4. def deposit(amount : Double) { balance += amount }
  5. ...
  6. }
  7. // 伴生对象
  8. object Account{
  9. private var lastNumber = 0
  10. def newUniqueNumber () = {lastNumber += 1; lastNumber}
  11. }

类和它的伴生对象可以相互访问私有特性.它们必须在同一个源文件中.

3. apply方法

我们通常会定义和使用对象的apply方法.当遇到如下形式的表达式时,apply方法就会被调用:

  1. Object(参数1,参数2,...,参数N)

通常,这样一个apply方法返回的是伴生类的对象. 举例来说,Array对象定义了apply方法,让我们可以用下面这样的表达式来创建数组:

  1. Array("Mary", "had", "a", "little", "lamb")

不使用构造器,而是使用apply方法,对于使用嵌套表达式而言,省去new关键字会方便很多:

  1. Array(Array(1,7), Array(2,9))

下面有一个定义apply方法的示例:

  1. class Account private (val id :Int, initialBalance: Double){
  2. private var balance = initialBalance
  3. ...
  4. }
  5. // 伴生对象
  6. object Account{
  7. def apply(initialBalance : Double){
  8. new Account(newUniqueNumber(), initialBalance)
  9. }
  10. ...
  11. }

这样我们就可以使用如下方式创建账号了:

  1. val acct = Account(1000.0)

4. 应用程序对象

每个Scala程序都必须从一个对象的main方法开始,这个方法的类型为Array[String]=>Unit:

  1. object Hello{
  2. def main(args: Array[String]){
  3. println("Hello world!")
  4. }
  5. }

除了每次都提供自己main方法外,你可以扩展App特质,然后将程序代码放入构造器方法体内:

  1. object Hello extends App{
  2. println("Hello world!")
  3. }

如果需要命令行参数,则可以通过args属性得到:

  1. object Hello extends App{
  2. if(args.length > 0){
  3. println("Hello, " + args(0))
  4. }
  5. else{
  6. println("Hello world!")
  7. }
  8. }

5. 枚举

不同于Java,Scala中没有枚举类型,需要我们通过标准库类Enumeration来实现:

  1. object BusinessType extends Enumeration{
  2. var FLIGHT, HOTEL, TRAIN, COACH = Value
  3. }

继承Enumeration类,实现一个BusinessType对象,并以Value方法调用初始化枚举中的所有可选值.在这里我们定义了4个业务线类型,然后用Value调用它们初始化.

每次调用Value方法都返回内部类的新实例,该内部类也叫做Value.或者,可以向Value方法传入ID,名称:

  1. val FLIGHT = Value(0, "FLIGHT")
  2. val HOTEL = Value(10) // 名称为"HOTEL"
  3. val TRAIN = Value("TRAIN") // ID为11

如果不指定ID,ID为上一个枚举值上加一,如果不指定名称,名称默认为字段名.定义完成后,可以使用BusinessType.FLIGHT,BusinessType.HOTEL,BusinessType.TRAIN等来引用:

  1. def businessHandle(business: BusinessType.Value): Unit ={
  2. if(business == BusinessType.FLIGHT){
  3. println("this is a flight behavior")
  4. }
  5. else if(business == BusinessType.HOTEL){
  6. println("this ia a hotel behavior")
  7. }
  8. }
  9. def main(args: Array[String]): Unit = {
  10. val business = BusinessType.FLIGHT
  11. businessHandle(business) // this is a flight behavior
  12. }

如果觉的BusinessType.FLIGHT比较冗长繁琐,可以使用如下方式引入枚举值:

  1. import BusinessType._

使用时直接使用枚举值名称即可:

  1. def businessHandle(business: BusinessType.Value): Unit ={
  2. if(business == FLIGHT){
  3. println("this is a flight behavior")
  4. }
  5. else if(business == HOTEL){
  6. println("this ia a hotel behavior")
  7. }
  8. }

记住枚举值的类型是BusinessType.Value而不是BusinessType,后者是拥有这些值的对象,可以增加一个类型别名:

  1. object BusinessType extends Enumeration{
  2. type BusinessType = Value
  3. var FLIGHT, HOTEL, TRAIN, COACH = Value
  4. }

如下使用:

  1. def businessHandle(business: BusinessType): Unit ={
  2. if(business == FLIGHT){
  3. println("this is a flight behavior")
  4. }
  5. else if(business == HOTEL){
  6. println("this ia a hotel behavior")
  7. }
  8. }

枚举值的ID可以通过id方法返回,名称通过toString方法返回:

  1. val business = FLIGHT
  2. println("ID:" + business.id + " name:" + business.toString) // ID:0 name:FLIGHT

可以通过如下方式输出所有的枚举值:

  1. for(business <- BusinessType.values){
  2. println("ID:" + business.id + " name:" + business.toString)
  3. }
  4. ID:0 name:FLIGHT
  5. ID:1 name:HOTEL
  6. ID:2 name:TRAIN
  7. ID:3 name:COACH

你也可以通过枚举的ID或名称来进行查找定位:

  1. val FLIGHT1 = BusinessType(0)
  2. println("ID:" + FLIGHT1.id + " name:" + FLIGHT1.toString)
  3. val FLIGHT2 = BusinessType.withName("FLIGHT")
  4. println("ID:" + FLIGHT2.id + " name:" + FLIGHT2.toString)
  5. ID:0 name:FLIGHT
  6. ID:0 name:FLIGHT

[Scala]Scala学习笔记五 Object的更多相关文章

  1. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  3. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  4. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  5. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  6. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  7. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  9. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

随机推荐

  1. Metasploit 学习

    知识准备:CCNA/CCNP基础计算机知识框架:操作系统.汇编.数据库.网络.安全 木马.灰鸽子.口令破解.用后门拷贝电脑文件 渗透测试工程师 penetration test engineer &l ...

  2. Hive创建一个简单的UDF

    创建一个类 package com.dufeng.hive; import org.apache.commons.lang.StringUtils; import org.apache.hadoop. ...

  3. python sklearn.cross_validation 模块导入失败

    参考链接: https://blog.csdn.net/Jae_Peng/article/details/79277920 解决办法: 原来在 cross_validation 里面的函数都放在 mo ...

  4. 在使用Vue.js中使用axios库时,遇到415错误(不支持的媒体类型(Unsupported media type))

    知识点:vue2.0中使用axios进行(put,post请求时),遇到415错误 解决办法:在axios的第三个参数config中,设置请求头信息'Content-Type': 'applicati ...

  5. 转载 URL短地址压缩算法

    文章转载http://www.nowamagic.net/webdesign/webdesign_ShortUrlInTwitter.php /// <summary> /// 生成sal ...

  6. 01_HBase概述

    1. HBase在Hadoop生态圈中的位置 问题:HBase 是什么,用在哪里,解决什么样的问题? 解答: 1)简单来说, HBase 是一种类似于面向列的分布式数据库(集群), 底层利用HDFS ...

  7. Springcloud/Springboot项目绑定域名,使用Nginx配置Https

    https://blog.csdn.net/a_squirrel/article/details/79729690 一.Https 简介(百度百科) HTTPS(全称:Hyper Text Trans ...

  8. 实现基本的Ajax和Json请求

    前面已经封装好了一个方法ajax(),通过这个方法可以实现Ajax请求,接下来就是给出 例程来测试这个方法和实现简单的功能.   视图的部分代码如下: <body> <div> ...

  9. Kafka消息topic分区

      kafka是为分布式环境设计的,因此如果日志文件,其实也可以理解成消息数据库,放在同一个地方,那么必然会带来可用性的下降,一挂全挂,如果全量拷贝到所有的机器上,那么数据又存在过多的冗余,而且由于每 ...

  10. python的os.urandom 的用途

    Python中os.urandom(n)的作用 随机产生n个字节(0-255)的字符串,可以作为随机加密key使用~ >>> index = os.urandom(2) >&g ...