/**
* 谨献给我最爱的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")
}
当你将一个样本对象和一个样本的反编译版本类进行比较,你将能够看到两者之间的差异。
样本对象和样本类
在样本对象中缺少以下东西。
apply
,unapply
方法。我们稍后会看到这个- 因为它是一个单例,所以没有复制方法
- 没有结构相等比较的方法
- 也没有构造函数
与样本类相比,缺少的这些部分是实际上是不需要的。
样本对象的优势
与普通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中使用样本对象作为枚举的基本结构
这些是学习各种函数式编程概念所必备的高级主题。我们会一个个征服他们。
敬请关注!^_^
------------------------
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
- 本文翻译作者为:dogstar,发表于艾翻译(itran.cc);欢迎转载,但请注明出处,谢谢!