Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单例模式在Java中的实现_Java_Design Patterns_Singleton - Fatal编程技术网

单例模式在Java中的实现

单例模式在Java中的实现,java,design-patterns,singleton,Java,Design Patterns,Singleton,最近有人在采访中问我:如何在Java中实现单例设计模式 我有点困惑,因为有两种选择: 1) 只有一个静态数据成员。静态成员,例如 private static Logger logger; 将确保给定类的所有对象之间只共享一个记录器 2) 实现限制实例的实例控制器: public class LoggerWrapper { private static Logger instance = null; private LoggerWrapper() {

最近有人在采访中问我:如何在Java中实现单例设计模式

我有点困惑,因为有两种选择:

1) 只有一个静态数据成员。静态成员,例如

private static Logger logger;
将确保给定类的所有对象之间只共享一个记录器

2) 实现限制实例的实例控制器:

public class LoggerWrapper {
        private static Logger instance = null;

        private LoggerWrapper() {       }

        public static Logger getInstance() {
                if (instance == null) {
                        instance = new Logger ();
                }
                return instance;
        }
}

这两种单例方法有什么区别?

第一种方法在你的课堂之外是不可访问的。第二个可以由类使用,而不是在其中声明其属性的类。正如Sotirios Delimanolis所指出的,实例需要是静态的,以便静态getInstance()方法可以访问它,从而确保所有调用方获得相同的版本


请注意,对于单例,有很多种方法,在实现一种方法之前,您应该仔细考虑

实例
字段必须是
静态
。好吧,您的第二个代码将无法编译。也不是线程安全的,您可以使用
枚举
生成单例。。还有延迟的按需初始化hat about
private static final Logger LOG=LoggerFactory.getLogger(MyClass.class)?我不认为这是一个很好的复制品-虽然这个问题是关于如何实现单例的,但明确的答案是:不要这样做。。。