Scala中的caseclass(一)

46 阅读2分钟

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 方法

最佳实践

  1. 用于值对象:适合表示不可变的数据结构
  2. 短生命周期数据:DTO、配置、消息传递等
  3. 模式匹配场景:状态机、AST 等
  4. 避免可变字段:保持不可变性
  5. 保持简单:避免在 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 函数式编程的核心特性之一,极大地简化了数据模型的创建和使用。