0

这就是我始终创建线程安全单例的方式,以便在多线程应用程序中使用它。

public class Logger {

    private Logger() {}

    private static Logger instance = new Logger();

    public static Logger getInstance() {
        return instance;
    }

    public void log(String s) {
        // Log here
    }
}

今天我正在学习获得 Java 认证,并在书中找到了另一个解决方案:

public class Logger {

    private Logger() {}

    private static Logger instance;

    private static class LoggerHolder {
        public static Logger logger = new Logger();
    }

    public static Logger getInstance() {
        return LoggerHolder.logger;
    }

    public void log(String s) {
        // Log here
    }
}

他们没有提到另一个。

什么更好?这两种解决方案有什么区别?

4

2 回答 2

1

第二个示例不太可能仅仅因为您访问了该类而创建实例。相反,您必须访问内部类。这种程度的偏执对于 JDK 库设计者来说是有道理的,但在更受控制的代码库中,它超过了恕我直言。

我更喜欢简单,而是使用它

public enum MyLogger {
    INSTANCE;

    public void log(String s) {
       // log here
    }
}

我强烈建议不要创建一个名为LoggerThere 的类,该类的许多可用实现已经足够混乱,包括一个内置。

于 2013-05-11T21:41:32.697 回答
0

第二个是懒惰的。如果出于某种奇迹,程序加载了类但从不调用getInstance(),则不会创建可能是一个昂贵的对象的记录器实例。

坦率地说,如果真的需要单例(并且使用依赖注入框架,它们几乎总是不需要的),我更喜欢第一种解决方案,它更容易理解。我很少(如果有的话)见过一个单例,其类已加载但从未在实际代码中使用过。

于 2013-05-11T21:43:02.517 回答