scala - 空案例类是否应该是单个实例?
问题描述
我有一个 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 = ...
解决方案
不使用单个实例的原因(如果有)是什么
没有理由不使用DataClass
这里的单个实例来表示空值,因为您的案例类由不可变数据组成并且不是通用的。在伴生类中指定一个值empty
来表示空案例是完全合理和惯用的。
作为旁注,dataList.tail
在我看来,上面建议您用来避免空对象的评论不是很好的建议。该dataList
序列可能为空,在这种情况下调用tail
它会抛出一个UnsupportedOperationException
. 当然,您可以捕获并处理这些异常,但这通常不是一个好主意——通常 Scala 中的异常应该仅用于实际异常问题,而空集合并不适合这种描述。在您的收藏上使用的好处之一fold
是它迫使您处理空箱子。
总结一下:您的代码对我来说看起来完全正确。如果你想变得花哨,你可以做一些事情,比如提供一个cats.Monoid
实例DataClass
然后只使用dataList.combineAll
,但这取决于你的品味和你对依赖项的容忍度,你现在所拥有的是完全合理的。
推荐阅读
- servicenow - ServiceNow API - 如何获取所有用户及其所有属性
- reactjs - 方法“模拟”意味着在 1 个节点上运行。找到 0 代替 Jest 错误
- sql - 检查具有多列结果的字符串
- java - 过滤时导入漂亮的 JSON,但返回整个批次时不导入 + ID 中的丑陋括号
- deep-learning - TensorFlow 奇怪的内存使用情况
- bash - awk :容纳空白单元格值
- vba - 如何在 MS Access 中设置打印机属性
- javascript - angular 8 如何获取和设置值并从任何页面访问值?
- python - python列表创建者大于
- java - 我收到 ClassCastException: WrappedPreparedStatementJDK8 cannot be cast to SQLServerPreparedStatement