分享

scala中case class是什么?

desehawk 发表于 2017-12-5 18:44:21 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 15794
本帖最后由 desehawk 于 2017-12-5 18:45 编辑

阅读Scala代码,发现了case class,和case有什么关系吗?一查还真没什么关系。
这里贴出来分享给大家:

case class 跟普通class有什么区别


1、初始化的时候,不需要new,当然你也可以加上,普通类一定需要加上new
2、toString的实现更加漂亮
3、默认实现了equals   hashcode
4、默认是可以序列化的,也就是实现了Serializable
5、自动从scala.Producet中继承了一些函数
6、case class构造函数的参数是publiec级别的,我们可以直接访问
7、支持模式匹配
上面其实我们已经明白了case class ,其实就是class,与其它class有所不同。
1、代码示例

[mw_shl_code=scala,true]package com.yy.base  
  
/**
* case class 示例
*/  
abstract class Person  
case class Student(name:String,sno:Int) extends Person  
case class Teacher(name:String,tno:Int) extends Person  
case class None(name:String) extends Person  
  
object CaseClassTest extends App {  
    def caseClassMatch(p:Person) = p match{  
      case Student(name,sno) => println(name + " is a student,sno is:" + sno)  
      case Teacher(name,tno) => println(name + " is a teacher,tno is:" + tno)  
      case None(name) => println("None matched")  
    }  
      
    val p = Student("yy",20151214)  
    caseClassMatch(p)  
}  [/mw_shl_code]

2、结果

[mw_shl_code=scala,true]yy is a student,sno is:20151214  
[/mw_shl_code]
注意,当一个类被生成为case class 时,scala会默认作如下工作:
(1)如果参数不加var/val修改,默认为val。
(2)自动创建伴生对象,实现apply方法,方便了我们在创建对象时不适用new
(3)实现自己的toString、hashCode、copy和equals方法

3、copy等方法介绍

[mw_shl_code=scala,true]
  val t = Teacher("xx",2015)
    println("toString:" + t.toString())
    println("hashCode:" + t.hashCode())
    //深度copy
    val t1 = t.copy()
    println("copy之无参拷贝:" + t1)
    println("copy之无参拷贝t内容是否equals t1:" + t.equals(t1))
    println(t==t1)
    val t2 = t.copy(name="zz")
    println("t2:" + t2.toString())
    val t3 = t.copy(tno=111)
    println("t3:" + t3)
    val t4 = t.copy("ww",222)
    println("t4:" + t4)[/mw_shl_code]
结果如下:

[mw_shl_code=scala,true]
toString:Teacher(xx,2015)
hashCode:-1236856524
copy之无参拷贝:Teacher(xx,2015)
copy之无参拷贝t内容是否equals t1:true
true
t2:Teacher(zz,2015)
t3:Teacher(xx,111)
t4:Teacher(ww,222)

[/mw_shl_code]
4、多个参数的case class

[mw_shl_code=scala,true]
package com.yy.base

/**
* case class 多个参数示例
*/
abstract class Person1
case class Student1(name:String,sno:Int) extends Person1
case class Teacher1(name:String,tno:Int) extends Person1
case class None1(name:String) extends Person1
//SchoolPerson包含0或者多个Person类型参数的类
case class SchoolPerson(desc:String, person:Person1*)

object CaseClassNestedTest extends App {
    val sp = SchoolPerson("多个Person类型的类",Student1("xx",11),Teacher1("yy",22))
    sp match{
      case SchoolPerson(_,Student1(name,sno),_) => println(name+":"+sno)
      case SchoolPerson(_,_,Teacher1(name,tno)) => println(name+":"+tno)
      case _ => println("NO")
    }
}[/mw_shl_code]
结果为

[mw_shl_code=scala,true]xx:11  
[/mw_shl_code]

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条