用Case类生成模板代码
将类定义为case类会生成许多模板代码,好处在于:
①会生成一个apply方法,这样就可以不用new关键字创建新的实例。
②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法。如果是var也会有修改方法。
③会生成一个默认的toString的方法。
④会生成一个unapplay方法,在模式匹配时很好用。
⑤会生成equals和hashCode的方法。
⑥会生成copy的方法。
举个栗子:
①定义case时,在也不用new关键字来创建实例了:
1 2 3 4 5 | scala> case class Person(name: String,relation: String) defined class Person scala> val emily = Person( "Joker" , "niece" ) emily: Person = Person(Joker,niece) |
②case类的构造函数人数默认的是val,所以会自动生成访问方法,但不会有修改的方法。
1 2 3 4 5 6 7 8 9 10 11 12 | scala> case class Person(name: String,relation: String) defined class Person scala> val emily = Person( "Joker" , "niece" ) emily: Person = Person(Joker,niece) scala> emily.name res1: String = Joker scala> emily.name = "Marray" <console>: 14 : error: reassignment to val emily.name = "Marray" |
③把case类的构造函数参数声明为var,既有修改方法又有访问的方法。
1 2 3 4 5 6 7 8 9 10 11 | scala> case class Company(var name: String) defined class Company scala> val a = Company( "beijing shuma gs" ) a: Company = Company(beijing shuma gs) scala> a.name res2: String = beijing shuma gs scala> a.name = "shanghai jixie gs" a.name: String = shanghai jixie gs |
④case类的toString的方法的实现。
1 2 3 4 5 6 7 8 | scala> case class Company(var name: String) defined class Company scala> val a = Company( "beijing shuma gs" ) a: Company = Company(beijing shuma gs) scala> a res3: Company = Company(beijing shuma gs) |
⑤case class会自动生成一个unapply的方法,当需要在匹配表达式中提取信息时会很好用。
1 2 3 4 5 6 7 8 9 10 | scala> case class Animal(name:String,age: Int) defined class Animal scala> val a = Animal( "Dog" , 10 ) a: Animal = Animal(Dog, 10 ) scala> a match { | case Animal(n,m) => println(n,m) | } (Dog, 10 ) |
⑥case也同时生成了equals和hashCode,这样实例就可以比较了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | scala> case class Animal(name:String,age: Int) defined class Animal scala> val a = Animal( "Dog" , 10 ) a: Animal = Animal(Dog, 10 ) scala> val b = Animal( "Pig" , 10 ) b: Animal = Animal(Pig, 10 ) scala> a ==b res5: Boolean = false scala> val b = Animal( "Dog" , 10 ) b: Animal = Animal(Dog, 10 ) scala> a==b res6: Boolean = true scala> a.hashCode res7: Int = - 24782408 |
⑦case类创建一个copy方法,但需要克隆一个对象时很有用,在克隆时可以修改某些字段。
1 2 3 4 5 6 7 8 9 10 11 | scala> case class Animal(name:String,age: Int,sex: String) defined class Animal scala> val a = Animal( "Dog" , 10 , "nan" ) a: Animal = Animal(Dog, 10 ,nan) scala> val b = a.copy() b: Animal = Animal(Dog, 10 ,nan) scala> scala> val c = a.copy(name= "Pig" ,sex= "nv" ) c: Animal = Animal(Pig, 10 ,nv) |
所谓的人生开挂,不过是厚积薄发!
欢迎评论和转载!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步