为什么"案例类"不需要"新"来创建新对象

Ath*_*han 17 scala class case

在Scala中,您不需要使用"new"来创建新的"案例类"是什么原因?我现在试着寻找一段时间没有答案.

Tra*_*own 40

你想要怎么样为什么?正如另一个答案所指出的那样,自动生成的伴随对象的方法如何apply.

对于为什么:case类往往用来实现代数数据类型在Scala中,和new稀少构造函数允许代码是更优雅(创造价值看起来更像是通过模式匹配解构它,例如),而更类似于ADT其他语言的语法.


dmi*_*try 14

Case类具有已实现的预构建伴随对象apply().有人甚至抱怨这个:如何覆盖案例类伴侣中的应用 :)


Ahm*_*rdi 5

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

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

object Person {
def apply(name: String, age: Integer): Person = new Person(name,age)
}
Run Code Online (Sandbox Code Playgroud)

范例:

case class Person(name: String, age: Integer)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

因此,如果使用val p1 = Person("Frank", 23) 的不是构造函数,则此方法称为apply方法。

请阅读scala-object-apply-functions获取更多信息。