首页 > 解决方案 > Initialization-on-demand holder idiom - 什么时候加载类?

问题描述

我一直在看:https ://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom以了解更多关于单身人士的信息。

我的问题是静态内部类究竟什么时候被加载,什么时候被初始化?我的理解是可以加载类但在绝对需要初始化之前保持未初始化。

如果类没有加载,那么在JVM中如何指定私有静态内部类呢?

标签: javajvminternals

解决方案


初始化类的确切时间在Java® 语言规范第 12.4.1 节中指定

§12.4.1。初始化发生时

类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:

  • T是一个类,并T创建了一个实例。
  • 调用static由声明的方法。T
  • 分配static了声明的字段。T
  • 使用static声明的字段,T并且该字段不是常量变量(§4.12.4)。
  • T是一个顶级类(§7.6),并且执行一个在词法上嵌套在(§8.1.3assert )中的语句(§14.10 ) 。T

当一个类被初始化时,它的超类被初始化(如果它们之前没有被初始化),以及声明任何默认方法(§9.4.3 )的任何超接口( §8.1.5)(如果它们之前没有被初始化) )。接口的初始化本身不会导致其任何超接口的初始化。

Java 9 中删除了最后一个项目符号

加载的时间不是固定的,可能取决于实现细节,例如验证器是如何实现的。但显然,它必须在初始化之前发生。

从 JVM 的角度来看,这是一个嵌套类这一事实并没有什么特别的意义。在外部类的常量池中有一个对内部类的符号引用,就像任何其他被引用的类一样。需要时会解决


推荐阅读