gpt4 book ai didi

java - 实例化发生在 getInstance() 之前还是 getInstance() 时?

转载 作者:行者123 更新时间:2023-11-29 08:41:56 24 4
gpt4 key购买 nike

我正在按照本教程创建 Singleton,所有者在以下方法时有评论 http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples

public class EagerInitializedSingleton {

private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();

//private constructor to avoid client applications to use constructor
private EagerInitializedSingleton(){}

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

If your singleton class is not using a lot of resources, this is the approach to use. But in most of the scenarios, Singleton classes are created for resources such as File System, Database connections etc and we should avoid the instantiation until unless client calls the getInstance method.

问题是:

他们说除非客户端调用getInstance方法,否则我们应该避免实例化但是据我所知,在这段代码中,(对象实例的)实例化总是在类 EagerInitializedSingleton 加载时发生,而 EagerInitializedSingleton 仅在我们调用 EagerInitializedSingleton.getInstance( )
=> 实例化将按时发生在 getInstance() 之前,绝不会发生在 getInstance()

之前

引用:

静态变量只初始化一次,在执行开始时(当类加载器第一次加载类时)。(来自https://stackoverflow.com/a/8704607/5381331)

那么什么时候加载类呢?
恰好有两种情况:
- 当执行新的字节码时(例如,FooClass f = new FooClass();)
- 当字节码对类进行静态引用时(例如,System.out)(来自http://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html)

我是错了还是对了。请给我一些建议。

最佳答案

在这种情况下,使用特定代码,您可能是正确的。

但是,如果您有 EagerInitializedSingletonstatic 方法,或者 staticfinal 成员>EagerInitializedSingleton 在调用 getInstance 之前引用了代码库中的某处,EagerInitializedSingletoninstance 变量将初始化。

与在 EagerInitializedSingleton 类上反射调用 Class.forName 相同。

请注意(请原谅这里显而易见的地方)有其他方法可以声明单例,包括惰性初始化或枚举。

关于java - 实例化发生在 getInstance() 之前还是 getInstance() 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com