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

问题描述 投票:16回答:3

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

class scala case
3个回答
38
投票

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

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


14
投票

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


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了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.