How to implement the Singleton Pattern with a Scala object

This is an excerpt from the 1st Edition of the Scala Cookbook (partially modified for the internet). This is Recipe 6.5, “How to implement the Singleton Pattern with a Scala object.”

Problem

You want to create a Singleton object to ensure that only one instance of a class exists. (That is, you want to implement the Singleton Pattern in Scala.)

Solution

Create Singleton objects in Scala with the object keyword. For instance, you might create a Singleton object to represent something like a keyboard, mouse, or perhaps a cash register in a pizza restaurant:

object CashRegister {
    def open { println("opened") }
    def close { println("closed") }
}

With CashRegister defined as an object, there can be only one instance of it, and its methods are called just like static methods on a Java class:

object Main extends App {
    CashRegister.open
    CashRegister.close
}

This pattern is also common when creating utility methods, such as this DateUtils object:

import java.util.Calendar
import java.text.SimpleDateFormat
object DateUtils {

    // as "Thursday, November 29"
    def getCurrentDate: String = getCurrentDateTime("EEEE, MMMM d")

    // as "6:20 p.m."
    def getCurrentTime: String = getCurrentDateTime("K:m aa")

    // a common function used by other date/time functions
    private def getCurrentDateTime(dateTimeFormat: String): String = {
        val dateFormat = new SimpleDateFormat(dateTimeFormat)
        val cal = Calendar.getInstance()
        dateFormat.format(cal.getTime())
    }

}

Because these methods are defined in an object instead of a class, they can be called in the same way as a static method in Java:

scala> DateUtils.getCurrentTime
res0: String = 10:13 AM

scala> DateUtils.getCurrentDate
res1: String = Friday, July 6

Singleton objects also make great reusable messages when using actors. If you have a number of actors that can all receive start and stop messages, you can create Singletons like this:

case object StartMessage
case object StopMessage

You can then use those objects as messages that can be sent to actors:

inputValve ! StopMessage
outputValve ! StopMessage

See Chapter 13, Actors and Concurrency for more examples of this approach.

Discussion

In addition to creating objects in this manner, you can give the appearance that a class has both static and non-static methods using an approach known as a “companion object.” See the following recipe for examples of that approach.