Caseclass的用法

4 阅读1分钟
### 设计定位不同,case class 更轻量级,专为数据建模而生

// 普通 class 实例化(必须加 new)
class OrdinaryStudent (name: String, age: Int)

val ordinaryStudent = new OrdinaryStudent ("Bob", 17)
//case class 实例化(省略 new)

val student = Student ("Alice", 18, "Grade 12")
val student = Student ("Alice", 18, "Grade 12")
println (student.toString)// 输出:Student (Alice,18,Grade 12)
val student1 = Student ("Alice", 18, "Grade 12")
val student2 = Student ("Alice", 18, "Grade 12")
val student3 = Student ("Bob", 17, "Grade 11")

println (student1.equals (student2))// 输出:true(属性值完全一致,值比较为真)
println (student1.equals (student3))// 输出:false(属性值不同,值比较为假)
println (student1.hashCode == student2.hashCode)// 输出:true(相等对象哈希值一致)

val student = Student ("Alice", 18, "Grade 12")// 基于原实例创建新实例,仅修改 age 属性,其余属性不变
val updatedStudent = student.copy (age = 19)// 基于原实例创建新实例,修改 name 和 grade 属性val anotherStudent = student.copy (name = "Charlie", grade = "Grade 13")
println (student)// 输出:Student (Alice,18,Grade 12)(原实例未被修改,保持不可变)
println (updatedStudent)// 输出:Student (Alice,19,Grade 12)(新实例修改了 age 属性)
println (anotherStudent)// 输出:Student (Charlie,18,Grade 13)(新实例修改了 name 和 grade 属性)

// 普通 class 实现类似 case class 的功能(需大量手动编码)
class OrdinaryStudent (val name: String, val age: Int, val grade: String){ 
// 手动重写 toString 方法
override def toString:String = s"OrdinaryStudent (\(name,\)age,$grade)"