Wiki Markup |
---|
According to the Java Language Specification \[[JLS 2005|AA. Java References#JLSBibliography#JLS 05]\], section 8.3.2.1 "Initializers for Class Variables": |
...
Wiki Markup |
---|
According to the Java Language Specification \[[JLS 2005|AA. Java References#JLSBibliography#JLS 05]\], section 12.4 "Initialization of Classes and Interfaces": |
...
Wiki Markup |
---|
This statement asserts that the presence of a {{static}} field triggers the initialization of a class, however, in this example, a recursive attempt is being made to initialize the class already. Because such recursive attempts are ignored by the JVM, the default value of {{deposit}} is {{0}} during the initialization. \[[Bloch 2005|AA. JavaBibliography#Bloch References#Bloch 05]\] |
Compliant Solution
This compliant solution changes the initialization order of the class Cycle
so that the fields meant to be used in computations get duly initialized.
...
Wiki Markup |
---|
This noncompliant code example uses an inner class that extends the outer class. The outer class in turn, uses the {{static}} instance of the inner class. This results in a circular initialization issue \[[Findbugs 2008|AA. Java References#FindbugsBibliography#Findbugs 08]\]. |
Code Block |
---|
|
public class CircularClassInit {
static class InnerClassSingleton extends CircularClassInit {
static final InnerClassSingleton singleton = new InnerClassSingleton();
}
static final CircularClassInit foo = InnerClassSingleton.singleton;
}
|
...
Wiki Markup |
---|
Notably, class initialization cycles can also occur because of circularity in the code present within the {{static}} initializers of two or more classes \[[Findbugs 2008|AA. JavaBibliography#Findbugs References#Findbugs 08]\]. Also see the related guideline [MSC08-J. Avoid cyclic dependencies between packages]. |
...
Wiki Markup |
---|
\[[JLS 2005|AA. Java References#JLSBibliography#JLS 05]\] Sections [8.3.2.1, Initializers for Class Variables|http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.2.1]; [12.4, Initialization of Classes and Interfaces|http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.4]
Puzzle 49: Larger Than Life
\[[MITRE 2009|AA. Java References#MITREBibliography#MITRE 09]\] [CWE ID 665|http://cwe.mitre.org/data/definitions/665.html] "Improper Initialization" |
...