Scala代码段:案例类vs普通普通类

在Scala中,存在“案例类”的构造。 根据Martin Odersky的说法,这可以帮助您编写“常规的非封装数据结构”。 它似乎总是与模式匹配相关联。

那么什么时候使用案例类以及什么时候使用“普通”类呢?

我发现这个很好的解释说明:

“案例类可以看作是普通且不可变的数据保存对象,应仅取决于其构造函数参数。

这个功能概念使我们能够

  • 使用紧凑的初始化语法(Node(1,Leaf(2),None))
  • 使用模式匹配分解它们
  • 隐式定义相等比较

与继承结合使用,case类用于模拟代数数据类型。

如果对象在内部执行状态计算或表现出其他复杂的行为,则应为普通类。

定义案例类可免费获得许多样板代码:

  • 为构造函数参数生成吸气剂。 仅当参数声明为var时才生成设置器。 它们默认为val
  • 生成了一个不错的toString方法。
  • 生成equalshashCode方法。
  • 生成复制方法以克隆对象。
  • 生成了apply方法,从而无需在创建类的新实例时使用new关键字。
  • 将产生一个不应用方法。

通过在终端中启动Scala repl进行测试:

$ scala
Welcome to Scala version 2.11.4 (Java HotSpot(TM) Client VM, Java 1.7.0_75).
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class Camera(brand: String, model: String)
defined class Camera

scala> val myCamera = Camera("Canon", "5D Mark III")
myCamera: Camera = Camera(Canon,5D Mark III)

scala>

如果用“。”输入对象名称。 并按tab,代表将显示一些可用的方法。

scala> myCamera.
asInstanceOf   brand canEqual  copy  isInstanceOf   model   productArity   productElement   productIterator   productPrefix   toString

最后说明

Alvin Alexander写道,案例类主要用于创建“不可变记录”,您可以轻松地在模式匹配表达式中使用它们。

因此,尽管您可以将构造函数参数定义为var ,但它们应该是val

翻译自: https://www.javacodegeeks.com/2015/04/scala-snippet-case-class-vs-plain-ordinary-class.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值