A singleton is simply a class
that is instantiated exactly once.
Before release 1.5, there were two ways to
implement singletons. Both are based on keeping the constructor private and exporting a public static member to provide access to the sole instance.
In one approach, the member is a final field:
// Singleton with public
final field
public class
Singleton {
public static final
Singleton INSTANCE = new Singleton();
private Singleton()
{ ... }
}
The private constructor is called only once,
to initialize the public static final field Singleton.INSTANCE. Singleton
instance will exist once the Singleton class is initialized—no more, no less.
However a privileged client can invoke the private constructor using Reflection
by AccessibleObject.setAccessible
method.
//Singleton with static factory
public class
Singleton {
private static final
Singleton INSTANCE = new Singleton();
private
Singleton() { ... }
public static Singleton
getInstance() { return INSTANCE; }
}
To make a singleton class that is implemented
using either of the previous approaches serializable, it is not sufficient
merely to add implements Serializable to its declaration.
Each time a serialized instance is deserialized, a new instance will
be created. To
maintain the singleton guarantee, you have to declare all
instance fields transient and provide a readResolve method.
//readResolve method to preserve singleton property
private
Object readResolve() {
// Return the one true Singleton and let the garbage collector
// take care of the Singleton impersonator.
return
INSTANCE;
}
Singleton using enum:
As of release 1.5, there is a third approach
to implementing singletons. This approach is functionally equivalent to the public
field approach, except that it is more concise, provides the serialization machinery for free, and provides guarantee against multiple instantiation, even in the face of
sophisticated serialization or reflection attacks.
Enum is thread-safe which helps us to avoid double checking(=less code for better results).
While this approach has yet to be widely adopted, a single-element enum type is the best way to implement a singleton.
Enum is thread-safe which helps us to avoid double checking(=less code for better results).
While this approach has yet to be widely adopted, a single-element enum type is the best way to implement a singleton.
public enum
Singleton {
INSTANCE;
public void
doStuff(){
System.out.println("Singleton using Enum");
}
}
And this can be called from clients:
public static void
main(String[] args) {
Singleton.INSTANCE.doStuff();
}
No comments:
Post a Comment