Scala中的样例类详解
Scala中的样例类详解:
样例类Case Class Case Class一般被翻译成样例类,它是一种特殊的类,能够被优化以用于模式匹配。 当一个类被声名为case class的时候,scala会帮助我们做下面几件事情: 1、构造器中的参数如果不被声明为var的话,它默认的是val类型的,但一般不推荐将构造器中的参数声明为var。 2、自动创建伴生对象,同时在里面给我们实现子apply方法,使我们在使用的时候可以不直接使用new创建对象。 3、伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配。 4、实现自己的toString、hashCode、copy、equals方法 除此之此,case class与其它普通的scala类没有区别
参考:
//抽象Person类 abstract class Person //样例类Student case class Student(name: String, age: Int, stuNo: String) extends Person //样例类Teacher case class Teacher(name: String, age: Int, teaNo: String) extends Person //样例类 Nobody case class Nobody(name: String) extends Person object CaseClassDemo { def main(args: Array[String]): Unit = { //case class会自动生成apply方法,创建对象时无需用new val p: Person = Student("lisi", 20, "101") //match case模式匹配 p match { case Student(name, age, stuNo) => println(s"学生:$name, $age, $stuNo") case Teacher(name, age, teaNo) => println(s"老师:$name, $age, $teaNo") case Nobody(name) => println(s"其他人:$name") } /*case class常用方法,定义case class便会自动生成对应的toString,hashCode,equals,copy等方法,*/ val teacher = Teacher("jack", 30, "0010") //toString方法 println(teacher.toString) //无参copy方法 val teacher2 = teacher copy() /*特别注意: equals方法是检查值是否相等,而eq方法检查的是引用是否相等, 所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。 在Java中如果要对两个对象进行值比较,那么必须要实现equals 和hashCode方法。 而在scala中为开发者提供了case class,默认实现了equals 和hashCode方法。*/ //eq方法进行比较 println(teacher.eq(teacher2)) //equals方法根据对象内容进行比较 println(teacher equals (teacher2)) //==方法进行比较 println(teacher == teacher2) hashcode方法 println(teacher hashCode()) println("====================================") println(teacher2.toString) //带一个参数的copy方法 println(teacher2.copy("tony").toString) //带二个参数的copy方法 println(teacher2.copy("tony", 25).toString) //带三个参数的copy方法 println(teacher2.copy("tony", 25, "1002").toString) println("====================================") /*case class在实用应用中的用途: 某个类一旦被定义为case class,则编译器会自动生成该类的伴生对象,伴生对象中包括了apply方法及unapply方法, apply方法使得我们可以不需要new关键字就可以创建对象, 而unapply方法,则使得可以方便地应用在模式匹配当中, 另外编译器还自动地帮我们实现对应的toString、equals、copy等方法。 在实际中,case class除了在模式匹配时能发挥其强大的威力之外,在进行其它应用时,也显示出了其强大的功能。*/ } }
posted on 2021-03-26 18:00 RICH-ATONE 阅读(1889) 评论(0) 编辑 收藏 举报