gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:19:46 24 4
gpt4 key购买 nike

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

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

最佳答案

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

例如。如果你想

  • 将某些字段设为私有(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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com