Scala 中的 case class(样例类)是一种特殊的类,主要用于模式匹配和数据封装。它自动提供许多便捷功能,简化了不可变数据的处理。
主要特性
1. 自动生成方法
case class Person(name: String, age: Int)
// 自动获得:
// - equals 和 hashCode
// - toString
// - copy 方法(用于创建修改副本)
// - 伴生对象和 apply 方法
2. 简洁的实例化
// 不需要 new 关键字
val person = Person("Alice", 30)
// 等同于 Person.apply("Alice", 30)
3. 不可变性(默认)
case class Point(x: Int, y: Int)
val p = Point(1, 2)
// p.x = 3 // 编译错误!字段默认是 val
4. 模式匹配友好
def describe(p: Person): String = p match {
case Person("Alice", age) => s"Alice is $age years old"
case Person(name, age) if age < 18 => s"$name is a minor"
case _ => "Unknown person"
}
常用操作
复制和修改
val alice = Person("Alice", 30)
val olderAlice = alice.copy(age = 31) // 只修改 age
解构提取
val Person(name, age) = alice
// name = "Alice", age = 30
// 在 for 表达式中
val people = List(Person("Alice", 30), Person("Bob", 25))
for (Person(name, age) <- people if age > 25) yield name
比较相等性
val p1 = Person("Alice", 30)
val p2 = Person("Alice", 30)
val p3 = Person("Bob", 30)
p1 == p2 // true(基于值比较)
p1 == p3 // false
高级用法
可变字段
case class MutablePerson(var name: String, var age: Int)
// 不推荐,违背函数式编程原则
继承限制
// case class 不能继承另一个 case class
case class Employee(name: String, age: Int, salary: Double)
// extends Person(name, age) // 错误!
密封的 case class
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(width: Double, height: Double) extends Shape
// 编译器会检查模式匹配是否完整
def area(shape: Shape): Double = shape match {
case Circle(r) => math.Pi * r * r
case Rectangle(w, h) => w * h
}
与普通类的区别
| 特性 | Case Class | 普通 Class |
|---|---|---|
| 实例化 | 不需要 new | 需要 new |
equals/hashCode | 自动基于值实现 | 基于引用(需手动实现) |
toString | 自动生成易读形式 | 默认是类名@哈希值 |
copy 方法 | 自动生成 | 需要手动实现 |
| 伴生对象 | 自动生成 | 需手动创建 |
| 模式匹配 | 天然支持 | 需要 unapply 方法 |
最佳实践
- 用于值对象:适合表示不可变的数据结构
- 短生命周期数据:DTO、配置、消息传递等
- 模式匹配场景:状态机、AST 等
- 避免可变字段:保持不可变性
- 保持简单:避免在 case class 中定义复杂逻辑
// 典型应用:消息传递(如 Akka)
sealed trait Message
case class Greeting(text: String) extends Message
case class Data(payload: Array[Byte]) extends Message
case object Stop extends Message
Case class 是 Scala 函数式编程的核心特性之一,极大地简化了数据模型的创建和使用。