OOP 与模式匹配
Class、Trait、Case Class、match。
35 分钟
OOP 与模式匹配
Scala 的面向对象以 Class / Trait / Object 为核心,Case Class 提供不可变数据载体,match 表达式替代冗长的 if-else 与 instanceof。对照 /roadmaps/scala「OOP & Pattern Matching」节点。
学习目标
- 定义 class、trait、object 并理解单例与伴生对象
- 使用 case class 与 case object 建模数据
- 用 match 做结构化模式匹配与解构
核心概念
Class、Trait 与 Object
trait Greeter:
def greet(name: String): String
class ConsoleGreeter(prefix: String) extends Greeter:
def greet(name: String): String = s"$prefix, $name!"
object Greeter:
def default: Greeter = ConsoleGreeter("Hello")
val g = Greeter.default
println(g.greet("Scala"))
Trait 类似 Java interface(可有实现);object 是单例,伴生对象常放工厂方法与 apply。
Case Class 与模式匹配
enum Status:
case Pending, Running, Done
case class Bookmark(id: Long, url: String, title: String)
def describe(b: Bookmark): String = b match
case Bookmark(id, url, _) if url.startsWith("https") =>
s"secure#$id"
case Bookmark(id, _, title) =>
s"$title ($id)"
def next(s: Status): Status = s match
case Status.Pending => Status.Running
case Status.Running => Status.Done
case Status.Done => Status.Done
val bm = Bookmark(1L, "https://example.com", "Example")
println(describe(bm))
println(next(Status.Pending))
Scala 3 的 enum 替代部分 sealed trait + case object 写法;match 必须覆盖所有分支(编译器可检查 exhaustiveness)。
apply、copy 与伴生
case class User(name: String, email: String)
object User:
def apply(email: String): User =
User(email.takeWhile(_ != '@'), email)
val u1 = User("alice", "alice@example.com")
val u2 = User("bob@example.com") // 伴生 apply
val u3 = u1.copy(name = "Alice Wang")
println(u2.name)
println(u3)
Case class 自动生成 equals/hashCode/toString/copy;适合 DTO 与领域模型。
与 Java 对照
| Scala | Java |
|---|---|
trait | interface + default 方法 |