Scala class和case class的区别

  在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:
  1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;

scala> case class Iteblog(name : String)
defined class Iteblog
 
scala> val iteblog = Iteblog( "iteblog_hadoop" )
iteblog : Iteblog = Iteblog(iteblog _ hadoop)
 
scala> val iteblog = new Iteblog( "iteblog_hadoop" )
iteblog : Iteblog = Iteblog(iteblog _ hadoop)

  2、toString的实现更漂亮;

scala> iteblog
res 5 : Iteblog = Iteblog(iteblog _ hadoop)

  3、默认实现了equals 和hashCode;

scala> val iteblog 2 = Iteblog( "iteblog_hadoop" )
iteblog 2 : Iteblog = Iteblog(iteblog _ hadoop)
 
scala> iteblog == iteblog 2
res 6 : Boolean = true
 
scala> iteblog.hashCode
res 7 : Int = 57880342

  4、默认是可以序列化的,也就是实现了Serializable ;

scala> class A
defined class A
 
scala> import java.io. _
import java.io. _
 
scala> val bos = new ByteArrayOutputStream
bos : java.io.ByteArrayOutputStream =
 
scala> val oos = new ObjectOutputStream(bos)
oos : java.io.ObjectOutputStream = java.io.ObjectOutputStream @ 4 c 257 aef
 
scala> oos.writeObject(iteblog)
 
scala> val a = new A
a : A = $iwC$$iwC$A @ 71687 b 10
 
scala> oos.writeObject(a)
java.io.NotSerializableException : $iwC$$iwC$A

  5、自动从scala.Product中继承一些函数;
  6、case class构造函数的参数是public级别的,我们可以直接访问;

scala> iteblog.name
res 11 : String = iteblog _ hadoop

  7、支持模式匹配;
  其实感觉case class最重要的特性应该就是支持模式匹配。这也是我们定义case class的唯一理由,难怪Scala官方也说:It makes only sense to define case classes if pattern matching is used to decompose data structures. 。来看下面的例子:

object TermTest extends scala.App {
   def printTerm(term : Term) {
     term match {
       case Var(n) = >
         print(n)
       case Fun(x, b) = >
         print( "^" + x + "." )
         printTerm(b)
       case App(f, v) = >
         print( "(" )
         printTerm(f)
         print( " " )
         printTerm(v)
         print( ")" )
     }
   }
   def isIdentityFun(term : Term) : Boolean = term match {
     case Fun(x, Var(y)) if x == y = > true
     case _ = > false
   }
   val id = Fun( "x" , Var( "x" ))
   val t = Fun( "x" , Fun( "y" , App(Var( "x" ), Var( "y" ))))
   printTerm(t)
   println
   println(isIdentityFun(id))
   println(isIdentityFun(t))
}
100offer.png优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。
100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。
注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!
wy_ad.jpg 本博客文章除特别声明,全部都是原创!
禁止个人和公司转载本文、谢谢理解:过往记忆(https://www.iteblog.com/)
本文链接: 【Scala class和case class的区别】(https://www.iteblog.com/archives/1508.html)
喜欢 ( 42) 分享 (0)

你可能感兴趣的:(Scala class和case class的区别)