12-scala样例类(Case Classes)

例类(Case classes)和普通类差不多,只有几点关键差别,接下来的介绍将会涵盖这些差别。样例类非常适合用于不可变的数据。

定义一个样例类

一个最简单的样例类定义由关键字case class,类名,参数列表(可为空)组成:

scala 复制代码
case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意在实例化样例类Book时,并没有使用关键字new,这是因为样例类有一个默认的apply方法来负责对象的创建。

当你创建包含参数的样例类时,这些参数是公开(public)的val

scala 复制代码
case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")

println(message1.sender)  // prints guillaume@quebec.ca
message1.sender = "travis@washington.us"  // this line does not compile

你不能给message1.sender重新赋值,因为它是一个val(不可变)。在样例类中使用var也是可以的,但并不推荐这样。

比较

样例类在比较的时候是按值比较而非按引用比较:

scala 复制代码
case class Message(sender: String, recipient: String, body: String)

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

尽管message2message3引用不同的对象,但是他们的值是相等的,所以message2 == message3true

拷贝

你可以通过copy方法创建一个样例类实例的浅拷贝,同时可以指定构造参数来做一些改变。

scala 复制代码
case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

上述代码指定message4recipient作为message5sender,指定message5recipient为"claire@bourgogne.fr",而message4body则是直接拷贝作为message5body了。

相关推荐
IT_陈寒2 小时前
React状态管理终极对决:Redux vs Context API谁更胜一筹?
前端·人工智能·后端
晨星shine3 小时前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
蝎子莱莱爱打怪3 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
倚栏听风雨3 小时前
【ES避坑指南】明明存的是 "CodingAddress",为什么 term 查询死活查不到?彻底搞懂 text 和 keyword
后端
程序员爱钓鱼3 小时前
Go 操作 Windows COM 自动化实战:深入解析 go-ole
后端·go·排序算法
回家路上绕了弯4 小时前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
子玖4 小时前
实现微信扫码注册登录-基于参数二维码
后端·微信·go
IT_陈寒4 小时前
JavaScript代码效率提升50%?这5个优化技巧你必须知道!
前端·人工智能·后端
IT_陈寒4 小时前
Java开发必知的5个性能优化黑科技,提升50%效率不是梦!
前端·人工智能·后端
东风t西瓜4 小时前
飞书项目与多维表格双向同步
后端