不应在Scala中使用案例类的地方?

Alb*_*ard 25 scala

Scala中的案例类是使用模式匹配增强的标准类,等于......(或者我错了?).此外,他们的实例不需要"新"关键字.在我看来,它们比常规类更容易定义(或者我又错了吗?).

有很多网页告诉他们应该在哪里使用(主要是关于模式匹配).但他们应该避免在哪里?为什么我们不到处使用它们?

Dan*_*ral 20

案例类不足的地方有很多:

  • 当人们希望隐藏数据结构时.
  • 作为超过两个或三个级别的类型层次结构的一部分.
  • 当构造函数需要特殊考虑时.
  • 当提取器需要特殊考虑时.
  • 当相等和哈希码需要特殊考虑时.

有时这些要求在设计中会出现,并且需要将一个案例类转换为普通类.由于案例类的好处确实不是那么好 - 除了它们是为特别制作的少数特殊案例 - 我自己的建议是不要做任何案例类,除非明确使用它.

或者,换句话说,不要过度设计.


Rex*_*err 16

从case类继承是有问题的.假设你有这样的代码:

case class Person(name: String) { }

case class Homeowner(address: String,override val name: String)
  extends Person(name) { }

scala> Person("John") == Homeowner("1 Main St","John")
res0:  Boolean = true

scala> Homeowner("1 Main St","John") == Person("John")
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

也许这就是你想要的,但通常你想要== b当且仅当b == a.不幸的是,编译器无法自动为您明智地解决这个问题.

这变得更糟,因为hashCode Person("John")与hashCode不同Homeowner("1 Main St","John"),所以现在等于行为怪异 hashCode行为怪异.

只要您知道会发生什么,继承案例类就可以给出可理解的结果,但它已被视为不良形式(因此在2.8中已被弃用).

  • 在谷歌搜索"案例类继承已弃用",前三个点击将讨论它.弃用已经在2.8代码库中 - 如果你下载一个每晚的版本,你可以用一个简单的例子来试试. (2认同)