You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Java静态初始化器每次创建新对象实例都会被调用?

问题核心原因

你混淆了Java的实例初始化块和静态初始化块的作用:

  • 你当前写的无修饰符的{ icons_init(); }属于实例初始化块,Java会在每一次创建Cell类实例时、构造函数执行前,自动执行该块内的逻辑,因此你每调用一次new Cell(),icons_init()就会被触发一次,完全不符合你只初始化一次的预期。
  • 要实现静态成员仅在类加载时初始化一次的需求,你需要给初始化块加上static修饰,改为static { icons_init(); },这种静态初始化块只会在Cell类第一次被加载到JVM时执行一次,后续创建实例不会再触发。
代码优化建议
  • 因为静态初始化块仅执行一次,icons_init()方法里的icons.clear()逻辑完全多余,可以直接删除,避免无意义的操作。
  • 你已经把icons声明为static final,但HashMap本身是可变的,建议加载完所有图标后,用Collections.unmodifiableMap(icons)把Map转为不可变实例,避免后续业务代码不小心修改/删除图标,提升代码稳定性。
  • 目前图标加载失败仅打印堆栈,后续调用不存在的图标时会触发空指针,建议异常分支增加兜底逻辑,比如加载失败时放一个默认的占位图,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Maxim Voloshin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:08