在Scala中,伴生类(Case Class)和伴生对象(Case Object)是两个核心概念,它们共同提供了一种优雅的方式来组织代码和数据。
1.伴生类(Case Class)
伴生类是一种特殊的类,用于创建不可变的数据结构。当你在类定义前加上case
关键字时,Scala编译器会自动为你的类提供以下特性:
- 自动生成构造函数:不需要显式定义构造函数。
- 自动生成
apply
方法:允许你使用类名作为函数来创建实例。 - 自动生成
unapply
方法:支持模式匹配。 - 自动生成
toString
、equals
和hashCode
方法:这些方法都是基于类的字段生成的。 - 自动生成
copy
方法:允许你复制对象并修改某些字段。
伴生类通常用于表示数据,而不是行为。
case class Person(name: String, age: Int)
2.伴生对象(Case Object)
伴生对象是伴生类的一个单例对象,它与伴生类共享同一个名称。伴生对象在Scala中用于实现单例模式,即一个类只有一个实例。
伴生对象的声明也很简单,只需要在对象定义前加上case
关键字:
case object Singleton
使用场景
- 伴生类:当你需要创建一个只包含数据的类,并且希望自动提供一些便利的方法时,可以使用伴生类。
- 伴生对象:当你需要一个单例对象时,可以使用伴生对象。
示例
case class Person(name: String, age: Int)
object Person {
def apply(name: String, age: Int): Person = new Person(name, age)
}
val person1 = Person("Alice", 30)
val person2 = Person("Bob", 25)
// 使用伴生对象
case object Person
// 模式匹配
val person3 = Person("Charlie", 35)
person3 match {
case Person(name, age) => println(s"Name: $name, Age: $age")
}
// 伴生对象作为单例
val singleton = Person
Person
是一个伴生类,它自动提供了apply
、unapply
、toString
、equals
和hashCode
方法。同时,我们定义了一个伴生对象Person
,它提供了一个静态方法create
。