zoukankan      html  css  js  c++  java
  • 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
    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))
    }
     
  • 相关阅读:
    JS语法转换-ES6转ES5
    百度编辑器的初步使用
    github使用的小坑 处理
    关于input的检验问题
    一些代码规范(收集)
    jquery源码解析日常
    重操JS旧业第九弹:函数表达式
    重操JS旧业第八弹:面向对象与继承
    重操JS旧业第七弹:面向对象与对象创建
    重操JS旧业第六弹:基本类型包装
  • 原文地址:https://www.cnblogs.com/runnerjack/p/8621442.html
Copyright © 2011-2022 走看看