Singleton Objects

    As we know, Scala is a pure object-oriented language because every value is an object in Scala. Instead of static members, Scala offers singleton objects. A singleton is nothing but a class that can have only one instance.

    In this type of class, you need not create an object to call methods declared inside a singleton object. Instead, the method in the singleton object is accessed with the object's name (just like calling a static method in Java). In Scala, the main method is always present in a singleton object. A singleton object can extend class and traits.

    Creating singleton objects using an object keyword instead of a class keyword is possible.

    Example:

    object ConfigReader {                                        // Singleton object created using 
      object keyword
      def getUserDetail() = "TGB USER"
      def getPassword(user: String = "TGB USER") = "PASSWORD_FROM_DB"
    }
    
     
    val usr = ConfigReader.getUserDetail()            // Object creation not needed to call method
    
    val pwd = ConfigReader.getPassword()

    Output:

    val usr: String = TGB USER
    
    val pwd: String = PASSWORD_FROM_DB

    In Scala, an object is a class with exactly one instance created lazily when we reference the object. The methods declared inside the Scala singleton object are globally accessible; we don’t need an object for this. We can import them from anywhere in the program.

    And since Scala has no idea of static’, we must provide a point of entry for the program to execute. Scala singleton object makes for this. Without such an object, the code compiles but produces no output.

    Another example:

    import java.util.logging.{Level, Logger}
    
    object LoggerFactory {
    
      val logger = Logger.getLogger("MyLogger")
    
      def info(message: String) = logger.info(message)
    
      def error(message: String) = logger.log(Level.SEVERE, message)
    
      def warn(message: String) = logger.warning(message)
    }
     
    LoggerFactory.error("Failed to start")
    
    LoggerFactory.info("This is logger example")
    
    LoggerFactory.warn("Hey! you used a singleton object")

    Output:

    Jul 21, 2022 9:07:50 AM $line20.$read$$iw$LoggerFactory$ error
    SEVERE: Failed to start
    Jul 21, 2022 9:07:54 AM $line20.$read$$iw$LoggerFactory$ info
    INFO: This is logger example
    Jul 21, 2022 9:07:54 AM $line20.$read$$iw$LoggerFactory$ warn
    WARNING: Hey! you used a singleton object