Scala之Case Class

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.****.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                     

本文原文出处: http://blog.****.net/bluishglc/article/details/50914001 严禁任何形式的转载,否则将委托****官方维护权益!

Case Class的特别之处在于:

  1. 编译器会为Case Class自动生成以下方法:
    • equals & hashCode
    • toString
    • copy
  2. 编译器会为Case Class自动生成伴生对象
  3. 编译器会为伴生对象自动生成以下方法

    • apply
    • unapply
      这意味着你可以不必使用new关键字来实例化一个case class.
  4. case class的类参数在不指定val/var修饰时,会自动编译为val,即对外只读,如果需要case class的字段外部可写,可以显式地指定var关键字!

归纳起来,编译器会为Case Class自动生成的方法如***意Location是Class还是Object):

Scala之Case Class

以上就是Case Class的全部特征,简单地总结起来就是:让编译器帮忙自动生成常用方法!反过来,如果你手动实现了对应的方法和伴生对象,那么就等同于生成了Case Class. 而实际使用过程中,手动实现这些方法是很繁琐和无趣的,使用Case Class就是最好的选择。当你希望设计一个类只是用来作为数据载体时,
Case Class是一个很好的选择,实际上,这正是DTO(或者也有叫作VO)做的事情,所以说Case Class的一个典型应用场景就是DTO。

另外,通常不会让一个普通类继承Case Class,这会导致一些问题,比如:equals/hashCode/toString方法都会失效。

关于copy方法的补充:

copy方法会基于当前实例的所有字段值复制一个新的实例并返回, 你也可以在通过给copy方法传递参数来重新设定某一个或几个字段的值,这是通过命名参数实现(named parameters)实现的。举个例子:

scala> println(op)BinOp(+,Number(1.0),Var(x))scala> op.copy(operator = "-")res4: BinOp = BinOp(-,Number(1.0),Var(x))
  • 1
  • 2
  • 3
  • 4

BinOp是一个case class, op是一个实例,第3行我们调用它的copy方法,同时指定了operator 字段的值是一个减号,那么copy出来的实例它的operator字段的值就是减号,所有其他的字段都和原实例是一样的。

           

给我老师的人工智能教程打call!http://blog.****.net/jiangjunshow

Scala之Case Class
                     

本文原文出处: http://blog.****.net/bluishglc/article/details/50914001 严禁任何形式的转载,否则将委托****官方维护权益!

Case Class的特别之处在于:

  1. 编译器会为Case Class自动生成以下方法:
    • equals & hashCode
    • toString
    • copy
  2. 编译器会为Case Class自动生成伴生对象
  3. 编译器会为伴生对象自动生成以下方法

    • apply
    • unapply
      这意味着你可以不必使用new关键字来实例化一个case class.
  4. case class的类参数在不指定val/var修饰时,会自动编译为val,即对外只读,如果需要case class的字段外部可写,可以显式地指定var关键字!

归纳起来,编译器会为Case Class自动生成的方法如***意Location是Class还是Object):

Scala之Case Class

以上就是Case Class的全部特征,简单地总结起来就是:让编译器帮忙自动生成常用方法!反过来,如果你手动实现了对应的方法和伴生对象,那么就等同于生成了Case Class. 而实际使用过程中,手动实现这些方法是很繁琐和无趣的,使用Case Class就是最好的选择。当你希望设计一个类只是用来作为数据载体时,
Case Class是一个很好的选择,实际上,这正是DTO(或者也有叫作VO)做的事情,所以说Case Class的一个典型应用场景就是DTO。

另外,通常不会让一个普通类继承Case Class,这会导致一些问题,比如:equals/hashCode/toString方法都会失效。

关于copy方法的补充:

copy方法会基于当前实例的所有字段值复制一个新的实例并返回, 你也可以在通过给copy方法传递参数来重新设定某一个或几个字段的值,这是通过命名参数实现(named parameters)实现的。举个例子:

scala> println(op)BinOp(+,Number(1.0),Var(x))scala> op.copy(operator = "-")res4: BinOp = BinOp(-,Number(1.0),Var(x))
  • 1
  • 2
  • 3
  • 4

BinOp是一个case class, op是一个实例,第3行我们调用它的copy方法,同时指定了operator 字段的值是一个减号,那么copy出来的实例它的operator字段的值就是减号,所有其他的字段都和原实例是一样的。