我只是在某处阅读以下代码:

public class SingletonObjectDemo {

    private static SingletonObjectDemo singletonObject;
    // Note that the constructor is private
    private SingletonObjectDemo() {
        // Optional Code
    }
    public static SingletonObjectDemo getSingletonObject() {
        if (singletonObject == null) {
            singletonObject = new SingletonObjectDemo();
       }
       return singletonObject;
    }
}

我需要知道这部分的需要:
if (singletonObject == null) {
    singletonObject = new SingletonObjectDemo();
}

如果我们不使用这部分代码怎么办?仍然会有SingletonObjectDemo的单个副本,那么为什么我们需要此代码?

最佳答案

此类具有一个SingletonObjectDemo singletonObject字段,用于保存单例实例。现在有两种可能的策略-

1-您确实希望通过声明来初始化对象-

private static SingletonObjectDemo singletonObject = new SingletonObjectDemo();

这将导致您的单例对象在类加载时被初始化。这种策略的缺点是,如果您有很多单例,那么即使它们不再需要,它们也会全部初始化并占用内存。

2-您可以对对象进行延迟初始化,即在首次调用getSingletonObject()时对其进行初始化-
// note that this initializes the object to null by default
private static SingletonObjectDemo singletonObject;

...
if (singletonObject == null) {
        singletonObject = new SingletonObjectDemo();
    }

这样可以节省您的内存,直到真正需要单例为止。这种策略的缺点是方法的第一次调用可能会看到响应时间稍差,因为在返回对象之前必须初始化对象。

09-09 20:48