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

res5: Iteblog = Iteblog(iteblog_hadoop)

  3、默认实现了equals 和hashCode;

scala> val iteblog2 = Iteblog("iteblog_hadoop")

iteblog2: Iteblog = Iteblog(iteblog_hadoop)

 

scala> iteblog == iteblog2

res6: Boolean = true

 

scala> iteblog.hashCode

res7: 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@4c257aef

 

scala> oos.writeObject(iteblog)

 

scala> val = new A

a: = $iwC$$iwC$A@71687b10

 

scala> oos.writeObject(a)

java.io.NotSerializableException: $iwC$$iwC$A

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

scala> iteblog.name

res11: 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))

}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值