应该何时初始化类 - 在加载时或首次使用时?

时间:2014-09-11 07:15:14

标签: java classloader

可以使用java.lang.Class

的此方法动态加载类
public static Class<?> forName(String name, boolean initialize,
                               ClassLoader loader)

根据the JavaDoc,第二个参数用于控制类初始化的时间(执行静态初始化代码)。如果true,则在加载后和执行此方法期间初始化类; if false,初始化会延迟到第一次使用该类时。

现在,我理解了所有这些,但文档没有说明如何决定使用哪种策略。总是立即进行初始化更好吗?总是推迟首次使用会更好吗?这取决于具体情况吗?

1 个答案:

答案 0 :(得分:5)

是的,这取决于具体情况,但通常最好只在第一次使用时加载和初始化类。

您可能希望尽早初始化它们的情况(例如,通过为forName()调用它们):

  • 静态初始化块可能会检查外部资源(例如文件,数据库连接),如果这些失败,您甚至不想继续执行程序。
  • 与上一代相似:加载外部本机库。如果这些失败(或者不适合当前平台),您可能希望尽早发现,而不是继续使用您的应用。
  • 静态初始化块可能会执行冗长的操作,并且您不希望在以后需要延迟/滞后时,可以提前或在不同的后台线程上初始化它们。
  • 如果您有静态配置文件,其中类名被指定为文本,您可能希望尽早初始化/加载它们以检测配置错误/拼写错误。这些示例包括记录器配置文件,web.xml,弹簧上下文等。
  • 标准Java库中的许多类缓存某些数据,如HTTPUrlConnection缓存System.getProperty("http.agent")返回的HTTP用户代理。首次使用时,其值将被缓存,如果您更改它(使用类似System.setProperty()),则不会使用新值。如果您提前初始化正确的类,可以强制执行此类缓存,以保护它们稍后由代码修改。

不应该提前初始化的情况:

  • 在极少数情况下可能只需要的类,或者在整个应用程序运行期间甚至可能根本不需要的类。例如,当用户选择“帮助/关于”菜单时,GUI应用程序可能只显示“关于”对话框。显然不需要尽早加载相关的类(例如AboutDialog),因为这是一种罕见的情况,在大多数运行中,用户不会这样做/需要这个。