case class

来源:互联网 发布:商超软件 编辑:程序博客网 时间:2024/05/15 11:01
// case classes// 一种特别的类, // 默认不可变/可以通过模式匹配分解/关于比较/实例起来很简洁=>不需要使用newabstract class Notificationcase class Email(sourceEmail: String,  title: String, body: String) extends Notificationcase class SMS(sourceNumber: String, var message: String) extends Notificationcase class VoiceRecording(contactName: String, link: String) extends Notification// 不需要使用new 实例化时很简洁val emailFromJohn = Email("john.doe@mail.com", "Greetings From John!", "Hello World!")val smsFromJohn = SMS("john.doe@mail.com", "Greetings From John!")val title = emailFromJohn.title// 默认是公有的println(title)// 但是不可变的 因此不能重写<除非开始的时候申明为var 但不鼓励这样 >emailFromJohn.title = "Goodbye From John!" // This is a compilationsmsFromJohn.message = "ok"// 但是可以借助copy方法 , 拷贝的过程中, 改写原来的val editedEmail = emailFromJohn.copy(title = "I am learning Scala!", body = "It's so cool!")println(emailFromJohn) // prints "Email(john.doe@mail.com,Greetings From John!,Hello World!)"println(editedEmail) // prints "Email(john.doe@mail.com,I am learning Scala,It's so cool!)"// 比较相等 是比较每个成员的值// case类一定会实现 == 和 tostringval firstSms = SMS("12345", "Hello!")val secondSms = SMS("12345", "Hello!")if (firstSms == secondSms) {  println("They are equal!")}println("SMS is: " + firstSms)// 还可以使用模式匹配 这样表达更简洁def showNotification(notification: Notification): String = {  notification match {    case Email(email, title, _) =>      "You got an email from " + email + " with title: " + title    case SMS(number, message) =>      "You got an SMS from " + number + "! Message: " + message    case VoiceRecording(name, link) =>      "you received a Voice Recording from " + name + "! Click the link to hear it: " + link  }}val someSms = SMS("12345", "Are you there?")val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123")println(showNotification(someSms))println(showNotification(someVoiceRecording))// prints:// You got an SMS from 12345! Message: Are you there?// you received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123def showNotificationSpecial(notification: Notification, specialEmail: String, specialNumber: String): String = {  notification match {    case Email(email, _, _) if email == specialEmail =>      "You got an email from special someone!"    case SMS(number, _) if number == specialNumber =>      "You got an SMS from special someone!"    case other =>      showNotification(other) // nothing special, delegate to our original showNotification function  }}val SPECIAL_NUMBER = "55555"val SPECIAL_EMAIL = "jane@mail.com"val someSms2 = SMS("12345", "Are you there?")val someVoiceRecording2 = VoiceRecording("Tom", "voicerecording.org/id/123")val specialEmail = Email("jane@mail.com", "Drinks tonight?", "I'm free after 5!")val specialSms = SMS("55555", "I'm here! Where are you?")println(showNotificationSpecial(someSms2, SPECIAL_EMAIL, SPECIAL_NUMBER))println(showNotificationSpecial(someVoiceRecording2, SPECIAL_EMAIL, SPECIAL_NUMBER))println(showNotificationSpecial(specialEmail, SPECIAL_EMAIL, SPECIAL_NUMBER))println(showNotificationSpecial(specialSms, SPECIAL_EMAIL, SPECIAL_NUMBER))// prints:// You got an SMS from 12345! Message: Are you there?// you received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123// You got an email from special someone!// You got an SMS from special someone!
0 0
原创粉丝点击