我有一个Scala案例类:
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
...
}
我有一个空箱类的工厂。空案例类的主要用途是使用case class DataClass(data: A, otherData: B, isEmpty: Boolean = false) {
def someFunc(arg: C): D = ???
...
}
合并案例类的起始条件。
fold
这用作
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)
行,为什么不使用空DataClass对象的单个实例(如果有)是什么原因?
是否有任何理由更喜欢val empty: DataClass = DataClass(emptyA, emptyB, true)
或val empty: () => DataClass = ...
答案 0 :(得分:2)
不使用单个实例的原因(如果有的话)
这里没有理由不使用DataClass
的单个实例来表示空值,因为您的case类由不可变数据组成,并且不是通用的。在同伴类中有一个名为empty
的值来表示空情况是完全合理和惯用的。
作为旁注,以上建议您使用dataList.tail
来避免空对象的评论在我看来不是很好的建议。 dataList
序列可能为空,在这种情况下调用tail
会抛出UnsupportedOperationException
。您当然可以捕获并处理这些异常,但这通常不是一个好主意-Scala中的异常通常只应用于实际的特殊问题,而空集合并不真正适合该描述。在集合上使用fold
的好处之一是,它迫使您处理空的情况。
总结:您的代码对我来说确实正确。如果您想花哨的话,可以执行以下操作:为cats.Monoid
提供一个DataClass
实例,然后只使用dataList.combineAll
,但这取决于您的喜好以及对依赖项的容忍度,以及您现在拥有的完全是合理的。