在Scala中,存在“案例类”的构造。 根据Martin Odersky的说法,这可以帮助您编写“常规的非封装数据结构”。 它似乎总是与模式匹配相关联。
那么什么时候使用案例类以及什么时候使用“普通”类呢?
我发现这个很好的解释说明:
“案例类可以看作是普通且不可变的数据保存对象,应仅取决于其构造函数参数。
这个功能概念使我们能够
- 使用紧凑的初始化语法(Node(1,Leaf(2),None))
- 使用模式匹配分解它们
- 隐式定义相等比较
与继承结合使用,case类用于模拟代数数据类型。
如果对象在内部执行状态计算或表现出其他复杂的行为,则应为普通类。 “
定义案例类可免费获得许多样板代码:
- 为构造函数参数生成吸气剂。 仅当参数声明为var时才生成设置器。 它们默认为val 。
- 生成了一个不错的toString方法。
- 生成equals和hashCode方法。
- 生成复制方法以克隆对象。
- 生成了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