java - Initialization-on-demand holder idiom - 什么时候加载类?
问题描述
我一直在看:https ://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom以了解更多关于单身人士的信息。
我的问题是静态内部类究竟什么时候被加载,什么时候被初始化?我的理解是可以加载类但在绝对需要初始化之前保持未初始化。
如果类没有加载,那么在JVM中如何指定私有静态内部类呢?
解决方案
初始化类的确切时间在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 的角度来看,这是一个嵌套类这一事实并没有什么特别的意义。在外部类的常量池中有一个对内部类的符号引用,就像任何其他被引用的类一样。需要时会解决。
推荐阅读
- mongodb - 无法连接到mongodb云
- r - 从文本文件中读取特定列:R
- database - MS Access 2013 - 如何在自动更新的文本框上触发事件
- validation - 如何在 Rust 中验证用户输入并循环直到给出有效输入?
- javascript - 在 Javascript 中使用 Ipinfo.io
- android - Android Room 需要约 40 秒来执行第一个查询
- python -
() 接受 1 个位置参数,但给出了 2 个 - sql - 使用 UNION ALL 表达式 TSQL 排序 BY CASE
- python - /user/register 处的 ValueError 无法分配“('土木工程(CE)',)”:“User.department”必须是“Department”实例
- android - 写在从相机捕获的图像上