【问题标题】:Why "case class" doesn't need "new" to create a new object为什么“案例类”不需要“新”来创建新对象
【发布时间】:2012-07-31 09:48:43
【问题描述】:

在 Scala 中,您不需要使用“new”来创建新的“案例类”的原因是什么? 我试着搜索了一段时间没有答案。

【问题讨论】:

    标签: class scala case


    【解决方案1】:

    案例类在其伴随对象上为您提供自动生成 apply 函数,您可以像构造函数一样使用它。

    Scala 反编译的字节码中,您会发现 apply 函数创建如下:

    object Person {
    def apply(name: String, age: Integer): Person = new Person(name,age)
    }
    

    示例:

    case class Person(name: String, age: Integer)
    

    以下三个都做同样的事情。

    val p0 = new Person("Frank", 23) // normal constructor
    
    val p1 = Person("Frank", 23) // this uses apply
    
    val p2 = Person.apply("Frank", 23) // using apply manually
    

    所以如果你使用val p1 = Person("Frank", 23)它不是构造函数,这是一个调用apply方法的方法。

    请阅读scala-object-apply-functions 了解更多信息。

    【讨论】:

      【解决方案2】:

      案例类具有预构建的伴随对象,实现了apply()。甚至有人对此抱怨:How to override apply in a case class companion :)

      【讨论】:

        【解决方案3】:

        你想要如何还是为什么?正如其他答案所指出的,how 只是自动生成的伴随对象上的 apply 方法。

        为什么:在 Scala 中,case 类通常用于实现 algebraic data types,而 new-less 构造函数允许代码更优雅(创建一个值看起来更像是解构它例如,通过模式匹配),并且更类似于其他语言中的 ADT 语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多