Assuming we have the following case class:
case class CasePerson(firstName: String)
And we also define a companion object for it:
Case classes are implicitly accompanied with a companion object with an apply()
that has the same arguments as the primary constructor of the case class.
That is:
case class CasePerson(firstName: String)
Will be accompanied by
object CasePerson{
def apply(firstName: String) = new CasePerson(firstName)
}
Now if you also explicitly define a companion object, you can think of it as appending to the implicitly defined one.
For instance, in your example you added one new apply
to the companion object:
object CasePerson{
def apply() = new CasePerson("XYZ")
}
This statement, you can think of it as if it is creating an combined companion object:
object CasePerson{
def apply() = new CasePerson("XYZ") // the one manually added
def apply(firstName: String) = new CasePerson(firstName) // this one is automatically added
}
Now, if you decide to add your own version of the apply
that has the same arguments as the primary constructor, then this will overshadow the default behavior of the case class.
object CasePerson{
def apply() = new CasePerson("XYZ")
def apply(s: String) = Seq(new CasePerson(s), new CasePerson(s)) // will replace the default factory for the case class
}
Now, if you call CasePerson("hi")
it will instead generate:
List(CasePerson("hi"), CasePerson("hi"))
Scala case classes are syntactic sugar. When you create a case class the Scala compiler will create a companion object with an apply
and an unapply
method for you, which you can then use as if it simply exists. Here is a link to more in depth information on case classes.
You may also give your firstName
class parameter a default value. So you can create an instance with passing no parameter.
Example:
case class CasePerson(firstName : String = "XYZ")
val person = CasePerson()