我正在按照本教程创建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; }} 如果您的单例课程没有使用很多资源,这就是 使用方法。但是在大多数情况下,Singleton类是 为诸如文件系统,数据库连接等资源创建 并且我们应该避免实例化,除非客户调用 getInstance方法。问题是:他们说除非客户端调用getInstance方法,否则我们应该避免实例化但正如我在这段代码中所知道的,(对象实例的)实例化总是在类EagerInitializedSingleton加载时发生,而EagerInitializedSingleton仅在我们调用EagerInitializedSingleton.getInstance()时加载=>实例化将在getInstance()上按时发生,并且不会在getInstance()之前发生参考:静态变量仅在执行开始时初始化一次(当Classloader首次加载类时)。(来自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)我是对还是错?请给我一些建议。 最佳答案 在这种情况下,使用特定代码,您可能是正确的。但是,如果在调用static之前在代码库中的某个位置引用了EagerInitializedSingleton的static方法,或者final的EagerInitializedSingleton个非getInstance成员,则instance变量将初始化。与EagerInitializedSingleton类上的Class.forName反射调用相同。请注意(并在此处原谅不言而喻),还有其他声明单例的方法,包括延迟初始化或枚举。关于java - 实例化发生在getInstance()之前或何时getInstance()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39488874/