Classes: Auxiliary Constructors (and Default Parameter Values)

To create auxiliary class constructors, create this methods inside the class. Each constructor must take a different set of constructor parameters.

Auxiliary constructors

An example class with three auxiliary constructors:

class Pizza:

    var crustSize = Medium
    var crustType = Regular

    def this(cs: CrustSize, ct: CrustType) = 
        this()
        this.crustSize = cs
        this.crustType = ct

    def this(crustSize: CrustSize) = 
        this()
        this.crustSize = crustSize

    def this(crustType: CrustType) =
        this()
        this.crustType = crustType

    override def toString = 
        s"A $crustSize pizza with a $crustType crust."

end Pizza

These examples show how to use those constructors:

val p1 = Pizza()
val p2 = Pizza(Large, Thin)
val p3 = Pizza(crustSize = Large)
val p4 = Pizza(crustType = Thin)

Constructor parameters with default values

Constructor parameters can also have default values. Just add the default value after the data type, as shown here:

class Socket(val timeout: Int = 10_000):
    override def toString = s"timeout: $timeout, linger: $linger"

This is roughly the equivalent of having multiple constructors:

val s = Socket()
val s = Socket(5_000)

Here's another example with multiple constructor parameters that have different values:

class Socket(val timeout: Int = 10_000, val linger: Int = 5_000):
    override def toString = s"timeout: $timeout, linger: $linger"

This example is the equivalent of having three class constructors:

val s = Socket()
val s = Socket(3000)
val s = Socket(3_000, 4_000)

Note that by specifying the constructor parameter names, you can also create new Socket values like this:

val s = Socket(timeout=3000, linger=4000))
val s = Socket(linger=4000, timeout=3000)
val s = Socket(timeout=3000)
val s = Socket(linger=4000)

Similarly, this class definition:

class Pizza(
    var crustSize: CrustSize = Medium,
    var crustType: CrustType = Regular
):
    override def toString = 
        s"A $crustSize pizza with a $crustType crust."

lets you create a Pizza in these different ways:

val p1 = Pizza()    
val p2 = Pizza(Large, Thin)
val p3 = Pizza(crustSize = Large)
val p4 = Pizza(crustType = Thin)