“new” keyword in Scala

Use the new keyword when you want to refer to a class‘s own constructor:

class Foo { }

val f = new Foo

Omit new if you are referring to the companion object’s apply method:

class Foo { }
object Foo {
    def apply() = new Foo
}

// Both of these are legal
val f = Foo()
val f2 = new Foo

If you’ve made a case class:

case class Foo()

Scala secretly creates a companion object for you, turning it into this:

class Foo { }
object Foo {
    def apply() = new Foo
}

So you can do

f = Foo()

Lastly, keep in mind that there’s no rule that says that the companion apply
method has to be a proxy for the constructor:

class Foo { }
object Foo {
    def apply() = 7
}

// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7

And, since you mentioned Java classes: yes — Java classes rarely have
companion objects with an apply method, so you must use new and the actual
class’s constructor.

Leave a Comment