Many Java programmers, including my self, might have mistaken that the portion of code that initializes the static variables of a class called the static constructor.
Why Not A Java Static Constructor?
It is actually not a constructor that initializes the static variables’ value. This is because static variables do not need to and can not be constructed as they are being shared among the instances (object) of the class. The static variables just need to be initialized when the class is first accessed by any code by the Java runtime.
What Is Static Initialization Block?
In Java, it is called “static initialization block”:
A static initialization block is a normal block of code enclosed in braces, { }, and preceded by the static keyword. A class can have any number of static initialization blocks, and they can appear anywhere in the class body. The runtime system guarantees that static initialization blocks are called in the order that they appear in the source code.
Alternatively, you can write a private static method that return values to the static variables. The advantage of private static methods is that they can be reused later if you need to reinitialize the class variable.
Things To Take Note
Static initialization blocks are called in the order that they appear in the source code. You must be careful not to access to the variables that have not been initialized in the static initialization blocks. If you do so, you may encounter a NullPointerException
during runtime. It is always painful and time wasting to trace this kind of exception.
[java]public class Example1 {
static Obj obj1;
static Obj obj2;
static Obj obj3;
static {
// First call
obj1 = new Obj();
obj2.something() // This will throw NullPointerException
}
static {
// Second call
obj2 = new Obj();
}
static {
// Third call
obj3 = new Obj();
}
}[/java]
Secondly, the alternative to static blocks, the private static method, are called in the sequence of the static variables being written in the source code.
[java]public class Example2 {
static Obj obj1 = initObj1();
static Obj obj2 = initObj2();
static Obj obj3 = initObj3();;
private static Obj initObj3() {
// Third call
}
private static Obj initObj2() {
// Second call
}
private static Obj initObj1() {
// First call
}
}[/java]
Leave a Reply