Scala 中 case class 与 class 的区别

From:https://blog.csdn.net/hfutlxm/article/details/76154844

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  =  new  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  ==  = true
     case  _  = false
   }
   val  id  =  Fun( "x" , Var( "x" ))
   val  =  Fun( "x" , Fun( "y" , App(Var( "x" ), Var( "y" ))))
   printTerm(t)
   println
   println(isIdentityFun(id))
   println(isIdentityFun(t))
}


猜你喜欢

转载自blog.csdn.net/qq_15300683/article/details/80328733