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

时间:2012-08-02 12:14:51

标签: class scala case

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

3 个答案:

答案 0 :(得分:38)

您想要如何为什么?正如另一个答案所指出的,如何只是自动生成的伴随对象上的apply方法。

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

答案 1 :(得分:14)

Case类具有预先构建的伴随对象,其中apply()已实现。甚至有人抱怨过:How to override apply in a case class companion:)

答案 2 :(得分:4)

案例类在其伴随对象上为您提供了自动生成的 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了解详情。