Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best approach for using an Enum as a singleton in Java?

Tags:

java

singleton

Building on what has been written in SO question Best Singleton Implementation In Java - namely about using an enum to create a singleton - what are the differences/pros/cons between (constructor omitted)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

and then calling Elvis.INSTANCE.getAge()

and

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

and then calling Elvis.getAge()

like image 720
Miles D Avatar asked Jan 09 '09 12:01

Miles D


4 Answers

Suppose you're binding to something which will use the properties of any object it's given - you can pass Elvis.INSTANCE very easily, but you can't pass Elvis.class and expect it to find the property (unless it's deliberately coded to find static properties of classes).

Basically you only use the singleton pattern when you want an instance. If static methods work okay for you, then just use those and don't bother with the enum.

like image 90
Jon Skeet Avatar answered Oct 06 '22 00:10

Jon Skeet


A great advantage is when your singleton must implements an interface. Following your example:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

With:

public interface HasAge {
    public int getAge();
}

It can't be done with statics...

like image 39
Nicolas Avatar answered Oct 06 '22 01:10

Nicolas


(Stateful) Singletons are generally used to pretend not to be using static variables. If you don't actually use the publicly static variable then you will fool less people.

like image 9
Tom Hawtin - tackline Avatar answered Oct 06 '22 02:10

Tom Hawtin - tackline


I would choose the option which is the simplest and clearest. This is somewhat subjective, but if you don't know what is clearest, just go for the shortest option.

like image 8
Peter Lawrey Avatar answered Oct 06 '22 02:10

Peter Lawrey