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

Learn how our document data model can map directly to how you program your app, and native database features like secondary indexes, geospatial and text search give you full access to your data. Brought to you in partnership with MongoDB.

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


Discover when your data grows or your application performance demands increase, MongoDB Atlas allows you to scale out your deployment with an automated sharding process that ensures zero application downtime. Brought to you in partnership with MongoDB.

Topics:
java ,design pattens

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

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

X

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

{{ parent.tldr }}

{{ parent.urlSource.name }}