- เราสามารถเรียกใช้ constructor parameter ได้ โดยที่ไม่ต้องประกาศ val หรือ var
- เราสร้าง instance ของ case class ได้โดยไม่ต้อง ใช้ new
- Scala จัดการให้เมทธอด equals, toString และ hashCode โดยอัตโนมัติ
- ในไปใช้ใน pattern matching ได้โดยง่าย
- เป็น Immutable object
เราลองมาดูตัวอย่างกัน
case class Dog(name:String, age:Int) {}
object Hello {
def main(args: Array[String]) {
var a = Dog("a", 1)
var b = Dog("a", 1)
println(a.name)
println(a==b)
}
}
จะเห็นได้ว่าเราสร้าง instance ของ Dog ขึ้นมาโดยที่ไม่ใช้ new เลย และยังเรียกใช้ name ได้โดยที่ไม่ได้ประกาศ val/var name เลย ที่เป็นเช่นนี้เพราะ case class จะ export constructor parameter ออกมาให้ใช้งานโดยอัตโนมัติ
นอกจากจะพิมพ์ name ออกมาแล้ว เรายัง check ว่า instance a == instance b หรือไม่ ในกรณีนี้เท่ากันครับ เราจะพิมพ์ true ออกมา ทำไมถึงเป็นอย่างนั้น เพราะว่า Scala จะทำเมทธอด equals และ hashCode ผ่านทาง constructor parameter
ถ้าใครใช้ java bean อยู่จะเห็นว่าเราจะต้อง overide equals/getHashCode/toString เองทุกครั้ง แต่ถ้าเป็น Scala เราไม่ต้องทำครับ มาดูอีกตัวอย่างหนึ่ง
abstract class Animal
case class Dog(name:String) extends Animal
case class Cat(name:String, age:Int) extends Animal
case class Fish() extends Animal
คราวนี้เรามี Animal เป็น base class และมี Dog/Cat/Fish extends Animal และเป็น case class
object Hello {
def main(args: Array[String]) {
toPrint(Fish())
toPrint(Dog("a"))
var d = Dog("c")
}
def toPrint(a : Animal) {
a match {
case Dog(name)=> {
println(name)
}
case Cat(name, age)=> {
println(name + ": + age")
}
case _ => {
println("not match")
}
}
}
}
สังเกตุว่าเมทธอด toPrint รับ instance ของ Animal เข้ามาแล้วเช็กดูว่าเป็น instance ประเภทไหน ถ้าเป็น Dog จะพิมพ์ name ถ้าเป็น Cat จะพิมพ์ name + age ถ้าไม่ใช่ทั้งคู่จะพิมพ์ not match ออกมา
วันนี้คงพอแค่นึ้ครับ ครั้งต่อไปเรามาดูเรื่อง Implicit กัน
ไม่มีความคิดเห็น:
แสดงความคิดเห็น