我想知道在多线程环境中哪个更好。我理解Singleton作为Enum类型在类加载时创建一个实例。除此之外,我看不出还有什么有意义的。有什么利弊吗?
Enum 类型的Singleton:
public enum Singleton {
INSTANCE;
public void doSomething(){ ... }
}使用double-checked locking**:**的Singleton
public class Singleton{
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}发布于 2012-08-12 20:27:53
在多线程应用程序中,更简单、更容易理解代码更容易工作。
在我看来,第一个例子要比第二个简单得多,这才是最重要的。
使用enum的主要好处是它要简单得多,更复杂的例子是没有道理的。双锁示例允许您在单元测试中以有趣的方式更改单例,但我相信可以用另一种方式解决这一问题。
发布于 2012-08-12 21:33:53
单例存在更多的问题,而不仅仅是正确的实现。
人们经常使用单个对象,因此他们不必在任何地方传递对象,或者必须跨多个方法传递对象。
有很多例子可以用Singleton实例化jdbc连接。
在需要此连接的方法中,您可以轻松地访问它,因为它是一个Singleton。
public enum DBConnection {
INSTANCE;
private Connection connection;
public Connection getConnection(){
if(connection == null){
instantiateConnection();
}
return connection;
}
}并通过
DBConnection.INSTANCE.getConnection();但通常情况下,最好是使用依赖注入和一个愉快的框架。比如GUICE。
在您的代码中,您不会调用DBConnection.INSTANCE和getConnection(),您的类将有一个带有@Inject注释的字段DBConnection。你就用它吧。
@Inject
private DBConnection dBConnection;类将被注释为@ Singleton,使其成为singleton,并且框架将确保它是单例。
如果您有不同的环境,比如,测试和生产,您可以让框架为每个环境注入不同的对象。
发布于 2012-08-12 20:51:10
使用enum创建singleton因为是的简单快捷的方法而越来越受欢迎。
此外,您还将这里与双重检查锁定()进行了比较,但也有其他方法,无需使用enum.。
eg:
public class Test{
private static Test uniqueInstance = new Test();
private Test(){}
public static Test getInstance(){
return uniqueInstance;
}
}但我认为enum为 singleton提供了一个更清晰的自我解释代码,这是一种非常直接的方法。
https://stackoverflow.com/questions/11925539
复制相似问题