首页 > 解决方案 > 空案例类是否应该是单个实例?

问题描述

我有一个 Scala 案例类:

case class DataClass(data: A, otherData: B, isEmpty: Boolean = false) {

  def someFunc(arg: C): D = ???

  ...
}

我有一个空案例类的工厂。空案例类的主要用途是使用 afold来合并案例类的起始条件。

object EntityTag {

   val empty: DataClass = DataClass(emptyA, emptyB, true)

   def merge(d1: DataClass, d2: DataClass): DataClass = ???

}

这用作

dataList: Seq[DataClass] = ???
dataList.fold(DataClass.empty)(DataClass.merge)

关于 line val empty: DataClass = DataClass(emptyA, emptyB, true),如果有的话,不使用空 DataClass 对象的单个实例的原因是什么?

有什么理由喜欢val empty: () => DataClass = ...def empty(): DataClass = ...

标签: scala

解决方案


不使用单个实例的原因(如果有)是什么

没有理由不使用DataClass这里的单个实例来表示空值,因为您的案例类由不可变数据组成并且不是通用的。在伴生类中指定一个值empty来表示空案例是完全合理和惯用的。

作为旁注,dataList.tail在我看来,上面建议您用来避免空对象的评论不是很好的建议。该dataList序列可能为空,在这种情况下调用tail它会抛出一个UnsupportedOperationException. 当然,您可以捕获并处理这些异常,但这通常不是一个好主意——通常 Scala 中的异常应该仅用于实际异常问题,而空集合并不适合这种描述。在您的收藏上使用的好处之一fold是它迫使您处理空箱子。

总结一下:您的代码对我来说看起来完全正确。如果你想变得花哨,你可以做一些事情,比如提供一个cats.Monoid实例DataClass然后只使用dataList.combineAll,但这取决于你的品味和你对依赖项的容忍度,你现在所拥有的是完全合理的。


推荐阅读