使单例模式代码更强大

时间:2013-12-14 14:52:08

标签: java design-patterns singleton

public class SingletonDoubleCheckedLock {
    private volatile static SingletonDoubleCheckedLock uniqueInstance;

    private SingletonDoubleCheckedLock() {
    }

    public static SingletonDoubleCheckedLock getInstance() {
            if (uniqueInstance == null) {
                    synchronized (SingletonDoubleCheckedLock.class) {
                            if (uniqueInstance == null) {
                                    uniqueInstance = new SingletonDoubleCheckedLock();
                            }
                    }
            }
            return uniqueInstance;
    }
}

如果在运行getInstance()方法时发生任何错误(例如,在执行new SingletonDoubleCheckedLock()但内存不足时),我仍然希望getInstance()方法返回正确的结果。怎么做到这一点?

1 个答案:

答案 0 :(得分:1)

问题:“如果在运行getInstance()方法时发生任何错误......我仍然希望getInstance()方法返回正确的结果。如何实现?”

简短的回答:你无法保证。

有很多条件可以抛出Throwable

Throwable有两种主要类型(子类):ExceptionError

Exception用于指示应用程序中可能出现的阻止正常执行流程的情况,应用程序可能会在继续之前捕获并纠正该情况。必须最终捕获某些形式的异常(已检查的异常)。

Error用于表示严重异常的情况,应用程序无法从中恢复,其原因可能超出了应用程序的控制范围。你可以捕获一个错误,但没有太多意义,因为情况可能无法恢复。

正如您所看到的,如果您的getInstance()引发错误,那么在应用程序运行时您无能为力。如果发生异常,您只有恢复运动的机会。