Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

The Singleton Class Explained

DZone's Guide to

The Singleton Class Explained

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

· Java Zone ·
Free Resource

The CMS developers love. Open Source, API-first and Enterprise-grade. Try BloomReach CMS for free.

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());
}
}


BloomReach CMS: the API-first CMS of the future. Open-source & enterprise-grade. - As a Java developer, you will feel at home using Maven builds and your favorite IDE (e.g. Eclipse or IntelliJ) and continuous integration server (e.g. Jenkins). Manage your Java objects using Spring Framework, write your templates in JSP or Freemarker. Try for free.

Topics:
java ,design pattens

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}