san*_*oid 33 java static final initialization classloader
好吧,所以说我有一个看起来像这样的课程:
public class SignupServlet extends HttpServlet {
private static final Logger SERVLET_LOGGER=COMPANYLog.open(SignupServlet.class);
private static final ExceptionMessageHandler handler = new ExceptionMessageHandler();
private static final SignupServletObservableAgent signupObservableAgent =
new SignupServletObservableAgent(null, SERVLET_LOGGER);
}
Run Code Online (Sandbox Code Playgroud)
我可以指望类加载器按顺序初始化这些字段,这样我可以依赖SERVLET_LOGGER在signupObservableAgent之前实例化吗?
Lau*_*ves 52
是的,它们按照它们在源中出现的顺序进行初始化.您可以阅读The Java Language Specification,§12.4.2中的所有详细信息.见步骤9,其中包括:
...以文本顺序执行类的类变量初始值设定项和类的静态初始化程序,或接口的字段初始值设定项,就好像它们是单个块一样,除了最终的类变量和接口的字段,其值是compile-时间常数首先初始化...