Skip to main content

Singleton in Java

Singleton using Enum in Java

This is the way we generally declare Enum Singleton , it may contain instance variable and instance method but for sake of simplicity I haven’t used any, just beware that if you are using any instance method than you need to ensure thread-safety of that method if at all it affect the state of object. By default creation of Enum instance is thread safe but any other method on Enum is programmers responsibility.

/**
* Singleton pattern example using Java Enum
*/
public enum EasySingleton{
    INSTANCE;
}

You can acess it by EasySingleton.INSTANCE, much easier than calling getInstance() method on Singleton.


Singleton using double checked locking

Below code is an example of double checked locking in Singleton pattern, here getInstance() method checks two times to see whether INSTANCE is null or not and that’s why it’s called double checked locking pattern

/**
* Singleton pattern example with Double checked Locking
*/
public class DoubleCheckedLockingSingleton{
     
private volatile DoubleCheckedLockingSingleton INSTANCE;

     
private DoubleCheckedLockingSingleton(){}

     
public static DoubleCheckedLockingSingleton getInstance(){
         
if(INSTANCE == null){
            
synchronized(DoubleCheckedLockingSingleton.class){
                
//double checking Singleton instance
                
if(INSTANCE == null){
                    INSTANCE 
= new DoubleCheckedLockingSingleton();
                
}
            
}
         
}
         
return INSTANCE;
     
}
}



Singleton pattern with static factory method

Since Singleton instance is static and final variable it initialized when class is first loaded into memory so creation of instance is inherently thread-safe.

/**
* Singleton pattern example with static factory method
*/


public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}

You can call Singleton.getSingleton() to get access of this class.


Enum Singletons handled Serialization by themselves

Another problem with conventional Singletons are that once you implement serializable interface they are no longer remain Singleton because readObject() method always return a new instance just like constructor in Java. You can avoid that by using readResolve() method and discarding newly created instance by replacing with Singleton as shown in below example :

    //readResolve to prevent another instance of Singleton
    
private Object readResolve(){
        
return INSTANCE;
    
}

This can become even more complex if your Singleton Class maintain state, as you need to make them transient, but with Enum Singleton, Serialization is guaranteed by JVM.

Comments

Popular posts from this blog

JUnit – Run unit test in an Sequence / Order

In JUnit, we can use @FixMethodOrder(MethodSorters.xxx) to run the test methods in a sequence or order.

import org.junit.FixMethodOrder;import org.junit.Test;import org.junit.runners.MethodSorters;importstatic org.hamcrest.CoreMatchers.is;importstatic org.junit.Assert.assertThat;//Sorts by method name@FixMethodOrder(MethodSorters.NAME_ASCENDING)publicclassExecutionOrderTest{@TestpublicvoidtestB(){assertThat(1+1,is(2));}@Testpublicvoidtest1(){assertThat(1+1,is(2));}@TestpublicvoidtestA

Exploring Node.js Internals

I found a great article explaining Node JS internals, must read :

https://www.smashingmagazine.com/2020/04/nodejs-internals/


Some other articles :

Introduction to Node.jsBeing an official website, Node.dev explains what Node.js is, as well as its package managers, and lists web frameworks built on top of it.“JavaScript & Node.js”, The Node Beginner BookThis book by Manuel Kiessling does a fantastic job of explaining Node.js, after warning that JavaScript in the browser is not the same as the one in Node.js, even though both are written in the same language.Beginning Node.jsThis beginner book goes beyond an explanation of the runtime. It teaches about packages and streams and creating a web server with the Express framework.LibUVThis is the official documentation of the supporting C++ code of the Node.js runtime.V8This is the official documentation of the JavaScript engine that makes it possible to write Node.js with JavaScript. x