วันพฤหัสบดีที่ 14 พฤษภาคม พ.ศ. 2558

Scala Case Class

วันนี้เรามาดู case class กัน  case class ก้อเหมือนกับ class ปรกติโดยทั้่วไป แต่มีคุณสมบัติพิเศษขึ้นมาคือ

  1. เราสามารถเรียกใช้ constructor parameter ได้ โดยที่ไม่ต้องประกาศ val หรือ var
  2. เราสร้าง instance ของ case class ได้โดยไม่ต้อง ใช้ new 
  3. Scala จัดการให้เมทธอด equals, toString และ hashCode โดยอัตโนมัติ
  4. ในไปใช้ใน  pattern matching ได้โดยง่าย
  5. เป็น 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 กัน





ไม่มีความคิดเห็น: