Over a million developers have joined DZone.

The Singleton Class Explained

Understand three different ways to define the Singleton class in Java, and why one of them is preferred.

· Java Zone

Navigate the Maze of the End-User Experience and pick up this APM Essential guide, brought to you in partnership with CA Technologies

There are a handful of ways to define a Singleton class in Java. They aren’t that difficult, yet doing it the correct way matters. Here I have listed three ways of doing it. However, only the third, which uses an on-demand holder acronym is preferred as the singleton instance created here is thread-safe and unique.

Trivia 1: Why we don’t import classes like System, Integer and String?
Answer: The package java.lang.*; is implicitly imported.

Trivia 2: Can the main method of a Java program reside in an abstract class?
Answer: Yes it can! See the Driver class below.

1. Eager Singleton

package design.com.hamzeen;

public class EagerSingleton {

private static EagerSingleton ins = new EagerSingleton();

public static EagerSingleton getInstance() {
return ins;
}

private EagerSingleton() {
}
}

2. Lazy Singleton

package design.com.hamzeen;

public class LazySingleton {
private static LazySingleton ins;

public static LazySingleton getInstance() {
if (ins == null) {
ins = new LazySingleton();
}
return ins;
}

private LazySingleton() {
}
}

3. Singleton Holder

package design.com.hamzeen;

public class SingletonHolder {

public static SingletonHolder getInstance() {
return Holder.ins;
}

private final static class Holder {
private static final SingletonHolder ins = 
new SingletonHolder();
}

private SingletonHolder() {
}
}

The Driver and Output

package design.com.hamzeen;

public abstract class Driver {

public static void main(String[] args) {
EagerSingleton a1 = EagerSingleton.getInstance();
EagerSingleton a2 = EagerSingleton.getInstance();
System.out.println(a1.toString());
System.out.println(a2.toString());

LazySingleton b1 = LazySingleton.getInstance();
LazySingleton b2 = LazySingleton.getInstance();
System.out.println(b1.toString());
System.out.println(b2.toString());

SingletonHolder c1 = SingletonHolder.getInstance();
SingletonHolder c2 = SingletonHolder.getInstance();
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}


Thrive in the application economy with an APM model that is strategic. Be E.P.I.C. with CA APM.  Brought to you in partnership with CA Technologies.

Topics:
java ,design pattens

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}