急切初始化单例模式 vs 懒惰初始化单例模式

3

当我思考单例设计模式时,我陷入了急切初始化单例和静态块初始化单例模式之间的选择。 假设急切初始化单例类代码如下 -

public class EagerInitSingleton {

    private static final EagerInitSingleton instance = new EagerInitSingleton();

    //private constructor
    private EagerInitSingleton(){}

    public static EagerInitSingleton getInstance(){
        return instance;
    }
}

以下是静态块单例类代码-

public class StaticBlockSingleton {

    private static StaticBlockSingleton instance;

    private StaticBlockSingleton(){}

    //static block initialization for exception handling
    static{
        try{
            instance = new StaticBlockSingleton();
        }catch(Exception e){
            throw new RuntimeException("Exception occured in singleton instance");
        }
    }

    public static StaticBlockSingleton getInstance(){
        return instance;
    }
}

在这里不讨论懒加载和线程安全问题。我想了解静态块单例中的两个静态块如何产生差异。


你为什么对我们大喊大叫? - Pragnani
我来这里是为了学习,如果你不喜欢,请忽略它.. :) - himanshu sharma
1个回答

2
没有任何区别。
private static final EagerInitSingleton instance = new EagerInitSingleton();

等同于

private static final EagerInitSingleton instance;

static {
    instance = new EagerInitSingleton();
} 

那么只有异常处理是优势吗? - himanshu sharma
我认为,如果一个静态 final 字段可以在一行中初始化而不需要静态块,请这样做。只有当它不能在一行中完成(比如需要几行代码来初始化,或者像你的示例中需要 try/catch)时,才应该使用静态块。 - Paul Boddington
没问题。很高兴能帮忙。 - Paul Boddington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接