Why “case class” doesn't need “new” to create

2019-01-25 06:08发布

问题:

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.

回答1:

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.



回答2:

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



回答3:

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.



标签: class scala case