18

In Scala what is the reason that you don't need to use "new" to create a new "case class"? I tried searching for awhile now without answers.

4

3 回答 3

41

Do you want the how or the why? As the other answer notes, the how is just the apply method on the automatically generated companion object.

For the why: case classes are often used to implement algebraic data types in Scala, and the new-less constructor allows code that is more elegant (creating a value looks more like deconstructing it via pattern matching, for example) and that more closely resembles ADT syntax in other languages.

于 2012-08-02T12:32:23.493 回答
14

Case class has prebuilt companion object with apply() implemented. Someone even complains about this: How to override apply in a case class companion :)

于 2012-08-02T12:17:29.450 回答
7

Case classes provide you with an automatically generated apply function on their companion object that you can use like a constructor.

In Scala decompiled byte code you will find apply function created as the following :

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

Example :

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

The following three all do the same thing.

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

So if you use val p1 = Person("Frank", 23) it is not a constructor, this a method that call apply method.

Please read scala-object-apply-functions for more info.

于 2017-12-18T11:26:42.453 回答