scala - 为什么不应该只使用一个用例类?

标签 scala

为什么不应该只使用一个用例类?

毕竟,它们促进了不变性,通过访问器方法进行模式匹配等?

最佳答案

人们经常使用案例类,然后尝试自定义/滥用它们来做一些案例类应该做的事情。

例如。如果你想

  • 将某些字段设为私有(private)
  • 自定义相等/hashCode
  • 具有可变状态
  • 在构造实例时强制执行不变量

  • 您应该使用普通类,即使您必须输入更多内容。

    对纯、不可变和公共(public)数据使用案例类。基本上是一个带有命名元素的元组,仅此而已。使用普通类,例如可变资源(文件、GUI 控件等)的句柄

    人们经常认为您可以滥用案例类来完成为普通类保留的任务。所以这里有一些滥用案例类的例子:

    私有(private)成员(member)

    案例类的成员从来都不是真正私有(private)的
    case class Foo(x: Int, private val y: String)
    val x = Foo(1, "Secret")
    x.y // does not work, because y is private
    x.productElement(1) // still does work
    Foo.unapply(Foo(1,2)).get._2 // another, more typesafe way to get at the private fields
    

    私有(private)构造函数

    您可能认为通过将构造函数设为私有(private),可以强制执行不变量。在下面的示例中,您可能认为不可能创建 min > max 的范围。
    case class Range private (min: Int, max: Int)
    object Range {
      def create(a: Int, b: Int): Range =
        if(a < b) new Range(a, b) else new Range(b, a)     
    }
    

    但事实并非如此:
    scala> val wrong = Range.create(2,1).copy(min = 1000)
    wrong: Range = Range(1000,2)
    

    您还必须覆盖复制方法。等到您真正做到了无懈可击时,您还不如使用普通类。

    关于scala - 为什么不应该只使用一个用例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719507/

    相关文章:

    scala - 对 Scala 类型参数施加多个泛型类型约束

    java - 比较列表时 Scala FunSuite "should be"和 "==="之间的差异

    scala - 使用Scala将Map映射到Spark appln中的可变列表

    regex - 如何通过正则表达式拆分此字符串?

    scala - 为什么命令式语言没有模式匹配?

    scala - 为什么 Play 项目中 sbt-docker 的 enablePlugins(DockerPlugin) 会给出 "error: reference to DockerPlugin is ambiguous"?

    scala - 如何在Scala中声明 'object'类类型的构造函数?即单例的一次操作

    scala - Scala:如何使用flatMap和Options计算Seq [Double]的方差?

    scala - Akka 执行上下文与 Future 全局上下文

    scala - 让测试仅在 SBT 控制台外工作