印度朋友手把手教你学Scala(10):Scala里的样本对象


/**
 * 谨献给我最爱的YoYo 
 * 原文出处:https://madusudanan.com/blog/scala-tutorials-part-10-case-objects-in-scala/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-14
 */

本翻译已征得Madusudanan.B.N同意,并链接在原文教程前面。

样本对象

我们已经学习了对象样本类。样本对象是这两者的合体,即它是一个类似对象的单例并且有在样本类中大量的和大量的样板。唯一的区别是,样板是为一个对象而不是一个类完成的。

这是关于Scala系列教程的第十章。点击这里可查看整个系列。

目录

  • 简介
  • 样本对象和样本类
  • 样本对象的优势
  • 结论

简介

如果你需要针对样本类的样板,样本对象是非常有用的。

它们可以这样创建。

case object CaseObjectDemo {

  println("I am a case object")

}

当你将一个样本对象和一个样本的反编译版本类进行比较,你将能够看到两者之间的差异。

样本对象和样本类

在样本对象中缺少以下东西。

  • applyunapply方法。我们稍后会看到这个
  • 因为它是一个单例,所以没有复制方法
  • 没有结构相等比较的方法
  • 也没有构造函数

与样本类相比,缺少的这些部分是实际上是不需要的。

样本对象的优势

与普通object相比,我们可以清楚地看到,反编译类中生成什么。

  • toString方法
  • 基于Murmur哈希hashCode方法
  • 样本对象/样本类默认是可序列化的

我们可以通过以下代码示例来验证它是可Serializable的。

  // 将会打印false
  println(SerializationExample.isInstanceOf[Serializable])
  // 将会打印true
  println(CaseObjectSerializationExample.isInstanceOf[Serializable])

object SerializationExample {

}

case object CaseObjectSerializationExample {

}

如果我们使用普通的object,让它变得可序列化,那么它可以扩展特质Serializable

  // 将会打印true,因为它扩展了特质Serializable
  println(SerializationExample.isInstanceOf[Serializable])
  // 将会打印true
  println(CaseObjectSerializationExample.isInstanceOf[Serializable])

object SerializationExample extends Serializable{

}

case object CaseObjectSerializationExample {

}

结论

我们已经到了文章的结尾。这是一个相当短的,我们看到有一个叫做样本对象的东西,以及为什么它会存在。

当与其对应的样本类比较时,样本对象提供的普通对象的语法糖会成为一个争论。乍一看,他们似乎没有太多的优势,但实际上有很多。

在下面的教程中,我们将看到尊对象的用法,其中语法糖实际上变成良好的可读代码,特别是在这两种情况下:

1)当可以使用样本类和样本对象进行模式匹配时

2)在Scala中使用样本对象作为枚举的基本结构

这些是学习各种函数式编程概念所必备的高级主题。我们会一个个征服他们。

敬请关注!^_^

dogstar

一位喜欢翻译的开发人员,艾翻译创始人之一。

广州