向Scala案例类添加方法是一个好主意

时间:2016-05-05 22:58:59

标签: scala algebraic-data-types

案例类假设是代数类型,因此有些人反对向案例类添加方法。 有人可以举个例子说明为什么这是一个坏主意?

1 个答案:

答案 0 :(得分:1)

这是导致更多问题的问题之一。 以下是我对此的看法。

让我们看看定义案例类时会发生什么, Scala编译器执行以下操作,

  • 创建一个类及其伴随对象。
  • 实现可用作工厂的apply方法。这让我们 您创建没有new关键字的类的实例。
  • 在参数列表中使用val前缀所有参数。即。使它不可改变
  • 添加hashCodeequalstoString
  • 的实施
  • 实现unapply方法,案例类支持pattern matching。定义Algebraic Data Type时,这很重要。
    • 为字段生成accessors。请注意,它不会生成“mutators”

现在我们可以看到案例类不是Java Bean的精确对等体。 案例类往往代表Datatype代表entity。 我认为它们是程序员的好朋友,因为它减少了无穷无尽的getter的锅炉板,覆盖了equals和hashcode方法等。

现在回答这个问题,

如果从功能编程的角度来看它,那么案例类就是可行的方法,因为你会考虑不变性,相等性,并且你确信case class代表了一个数据结构。在这里,人们在FP中编程的很多时候都说将它们用于ADT。

如果你的case类具有适用于类state的逻辑,那么这对于函数式编程来说是一个糟糕的选择。

我更喜欢使用案例类来确定我需要一个类来表示数据结构的场景,因为这样我可以获得自动生成方法的帮助以及patter-matching的附加优势。当我以带有副作用的OO方式编程时,可变状态我使用class

尽管如此,仍然可能存在使用utlity方法的案例类的情况。我认为这些机会较少。