Java Enum as Singleton: Good or Bad?

4 07 2011

Item 3 in the 2nd Edition of Effective Java explains three ways of implementing a singleton in Java, the last of which is “Enum as Singleton”. This uses an Enum with a single element as a simple and safe way to provide a singleton. It’s stated as being the best way to implement a singleton (at least, for Java 5 onwards and where the additional flexibility of the “static factory method” approach isn’t required).

But is this technique a good or bad idea? Is anyone actually doing it this way? If you’ve used it or encountered it, are you happy with it or do you have any reservations?

Please note: I’m not interested in any wars over whether singletons are evil or not. The concept exists, one comes across them in real code, and there are reasonable discussions to be had over whether they are always a bad idea or have their uses in particular situations. None of that is relevant to how best to implement a singleton if one ever does wish to do so, or the pros and cons of different implementation techniques.

OK, with that dispensed with, what should we make of the “Enum as Singleton” technique?

From my point of view, it works, the code is trivially simple, and it does automatically take care of the “serialization” issue (that is, maintaining one instance per classloader even in the face of serialization and deserialization of the instance). But it feels too much like a trick, and (arguably) not in the spirit of the concept of an enumeration type. When I see an Enum that isn’t being used to enumerate a set of constants and that only has one element, I think I’m more likely to have to stop and figure out what’s going on rather than immediately and automatically thinking “oh, here’s a singleton”. If it becomes more common I’ll no doubt get used to seeing this idiom, but if so I might then find myself misled by any “normal” enumeration that just happens to only have one element.

Another concern is that whilst the use of a static factory method to provide a singleton offers more flexibility than either the use of a public static member or a single-element Enum, it requires different client code for accessing the singleton. So using either of the latter two approaches means that you risk having to change client code if you ever need to “upgrade” the singleton to the more flexible “static factory method” approach.

A further issue is how best to name Enum classes and instances that are implementing singletons. Should one stick to the usual naming conventions for Enums, or adopt some other naming convention (and maybe include “Singleton” in the name to make the intent clear)? And what if the singleton object is mutable in any way? Or is that a more general issue over the naming of enumeration “constants” if they are actually mutable? Or maybe it makes more sense to say that Enums must be genuine constants and should never, ever be mutable – in which case “Enum as Singleton” shouldn’t be used for any singleton with mutable state, which limits its applicability even more?

So now that the “Enum as Singleton” technique has been widely known for a few years, does anyone have any significant experiences from real-world use of it? Or any other opinions on this technique?



4 responses

20 08 2011

I think its a good solution to use Enum to implement Singleton in Java. Enum are more versatile than one can think of , see the below post 10 examples of enum in java to know what else can you do with enum in java.

10 interview question on Singleton in Java

11 01 2012

Very nice article and explanation for enum and singleton, because two concepts are confusing … but this article explains it greatly. I would also like to share one link about enum in java

9 07 2013

What is instance control?

Instance control basically refers to single instance of the class OR singleton design pattern .

Java 1.5 onwards we should always prefer ENUM to create singleton instance. It is absolutely safe . JVM guarantees that. All earlier mechanical of controlling instance to single are already broken.

So in any interview you can confidently say ENUM= provides perfect singleton implementation .

Now what is readResolve?

readResolve is nothing but a method provided in serializable class . This method is invoked when serialized object is deserialized. Through readResolve method you can control how instance will be created at the time of deserialization.Lets try to understand some code

public class President {

private static final President singlePresident = new President();

private President(){



This class generates single instance of President class. singlePresident is static instance and same will be used across.

But do you see it breaks anywhere?

Please visit for more details on this

18 01 2016
Lukáš Benzin Benda

1) Through ENUM you can implement singleton in scope ClassLoader. If you want have singleton through more then one ClassLoader (in more Nodes on example) it’s hard to implement it with ENUM
2) Enum can’t inherite anything from supper class
3) Mainly you doesn’t care if the class have only one instance in ClassLoader. You need instance which behave as singleton in specific scope.

So on example, you have Server and Android client. On both place you have User. In Android is User singleton in ClassLoader scope, on the Server is the singleton in Session scope.

So when you have implementation:
public abstract class AbstractUser impelments IUser {…}
public class ServerUser extends AbstractUser {…}
public class AndroidUser extends AbsractUser{
public static IUser getInstance() {…}

You implement the singleton on Android, but you can use a lot of functionality from non-singleton use.

So there are a lot of situation when you can’t use the ENUM singleton. If you use the ENUM singleton, you will end with more then one pattern to implement singleton in your code. And when you notice, the singleton isn’t the singleton in some scope, you must refactore the code.

So I decide, no, the using ENUM as singleton is antipattern.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

<span>%d</span> bloggers like this: