空案例类是否应该是单个实例?

时间:2019-02-20 19:44:52

标签: scala

我有一个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 = ...

1 个答案:

答案 0 :(得分:2)

  

不使用单个实例的原因(如果有的话)

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

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

总结:您的代码对我来说确实正确。如果您想花哨的话,可以执行以下操作:为cats.Monoid提供一个DataClass实例,然后只使用dataList.combineAll,但这取决于您的喜好以及对依赖项的容忍度,以及您现在拥有的完全是合理的。