单例 vs 公共静态最终变量

Jus*_*guy 4 java singleton

所以我知道单例模式是这样实现的:

public class ClassName {
    private static ClassName instance;

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

    private ClassName() {}
}
Run Code Online (Sandbox Code Playgroud)

我想问的是为什么你不能这样做:

public class ClassName {
    public static final ClassName instance = new ClassName();
    private ClassName() {}
}
Run Code Online (Sandbox Code Playgroud)

更少的代码行,似乎做同样的事情。当然减去延迟初始化,但我不明白为什么延迟初始化无论如何都会有很大的好处。我不是很有经验,如果你能用你的知识启发我,我将不胜感激,谢谢。

Mur*_*nik 5

内联初始化单例实例并让类加载器担心同步可能不是一种非常普遍的做法,但绝对不是闻所未闻。

然而,常见的习惯用法是将实例变量设为私有并通过 getter 返回它,这样其他代码就不会直接依赖它。这样,如果将来您决定想要更高级的东西(例如您提到的延迟初始化),您可以轻松地重构您的代码而不会破坏 API:

public class ClassName {
    private static final ClassName instance = new ClassName();

    public static ClassName getInstance() {
        return instance;
    }

    private ClassName() {}
}
Run Code Online (Sandbox Code Playgroud)

  • 如果不是公共API,我们不用担心;我们以后可以随时重构它。 (2认同)