【发布时间】:2012-07-31 09:48:43
【问题描述】:
在 Scala 中,您不需要使用“new”来创建新的“案例类”的原因是什么? 我试着搜索了一段时间没有答案。
【问题讨论】:
在 Scala 中,您不需要使用“new”来创建新的“案例类”的原因是什么? 我试着搜索了一段时间没有答案。
【问题讨论】:
案例类在其伴随对象上为您提供自动生成 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 了解更多信息。
【讨论】:
案例类具有预构建的伴随对象,实现了apply()。甚至有人对此抱怨:How to override apply in a case class companion :)
【讨论】:
你想要如何还是为什么?正如其他答案所指出的,how 只是自动生成的伴随对象上的 apply 方法。
为什么:在 Scala 中,case 类通常用于实现 algebraic data types,而 new-less 构造函数允许代码更优雅(创建一个值看起来更像是解构它例如,通过模式匹配),并且更类似于其他语言中的 ADT 语法。
【讨论】: