Is this the correct implementation of a singleton using enum?
public class Item3 {
public static void main(String[] args) {
Singleton s=Singleton.Single.INSTANCE.getInstance();
Singleton s2=Singleton.Single.INSTANCE.getInstance();
System.out.printf("%b",s==s2);
}
}
class Singleton {
enum Single{
INSTANCE;
Singleton s=new Singleton();
public Singleton getInstance(){
if(s==null)
return new Singleton();
else return s;
}
}
}
3 Answers 3
No, it is simpler to code than that:
enum Singleton
{
INSTANCE;
// instance vars, constructor
private final Connection connection;
Singleton()
{
// Initialize the connection
connection = DB.getConnection();
}
// Static getter
public static Singleton getInstance()
{
return INSTANCE;
}
public Connection getConnection()
{
return connection;
}
}
Then you use can use final Singleton s = Singleton.getInstance()
. Note however that since this is an enum you can always access this via Singleton.INSTANCE
.
And NEVER do that:
public Singleton getInstance(){
if(s==null)
return new Singleton();
else return s;
}
this is not thread safe! What is more, the new Singleton()
value is never assigned to s
... (thanks @DaveJarvis for noticing this!)
-
\$\begingroup\$ thanks. if I need to obtain a Database connection using singleton in this fashion then I would write
enum Singleton{ INSTANCE; Connection c=DB.getConnection(); }
and useConnection con = Singleton.INSTANCE.c
in client code? Please correct me if my understanding is not correct \$\endgroup\$Nishant– Nishant2013年06月12日 10:30:57 +00:00Commented Jun 12, 2013 at 10:30 -
\$\begingroup\$ See my edit. While you could make the connection available as you say, it is something I would not recommend personally. \$\endgroup\$fge– fge2013年06月12日 10:37:02 +00:00Commented Jun 12, 2013 at 10:37
-
\$\begingroup\$ @fge I know that this will help avoiding multiple objects creation from reflection and deserialization and cloning but will it also avoid creating multiple instances from threading? \$\endgroup\$SSC– SSC2015年04月12日 15:39:59 +00:00Commented Apr 12, 2015 at 15:39
-
\$\begingroup\$ What if you're initialization throws an exception? \$\endgroup\$Mario– Mario2015年10月14日 20:55:36 +00:00Commented Oct 14, 2015 at 20:55
-
\$\begingroup\$ @Mario then
try { ... } catch (Whatever e) { throw new ExceptionInInitializererror(e) }
\$\endgroup\$fge– fge2015年10月15日 06:30:50 +00:00Commented Oct 15, 2015 at 6:30
public enum Singleton{
INSTANCE;
}
This is enough; you can directly use Singleton.INSTANCE
to get the instance of the class.
Your response and other samples in Singleton_pattern
public enum Singleton {
INSTANCE;
public void execute (String arg) {
//... perform operation here ...
}
}