Singleton via enum way is lazy initialized?
This is a very wide-spread enum singleton code:
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
and a bunch of places said it is a lazy initialization. But I am confused after I read Chapter 7 of 'Inside the Java Virtual Machine' -- The Lifetime of a Type:
The Java virtual machine specification gives implementations flexibility in the timing of class and interface loading and linking, but strictly defines the timing of initialization. All implementations must initialize each class or interface on its first active use. The following six situations qualify as active uses:
The third point with bold style clarify that if the field is static final
, the initialization of the field is happened at compile-time. Likewise, the INSTANCE
in enumClazz
is implicitly equal to public static final
and comply with the third point.
Can someone correct me if my understanding is wrong?
enum
instance fields are not "initialized by a compile-time constant expression". They can't be, because only String
and primitive types are possible types for a compile-time constant expression.
That means that the class will be initialized when INSTANCE
is first accessed (which is exactly the desired effect).
The exception in the bold text above exists, because those constants ( static final
fields initialized with a compile-time constant expression) will effectively be inlined during compilation:
class A {
public static final String FOO = "foo";
static {
System.out.println("initializing A");
}
}
class B {
public static void main(String[] args) {
System.out.println(A.FOO);
}
}
Executing class B
in this example will not initialize A
(and will not print "initializing A"). And if you look into the bytecode generated for B
you'll see a string literal with the value "foo" and no reference to the class A
.
The third point with bold style clarify that if the field is 'static final', the initialzation of the field is happened at complie-time
Not exactly - it only applies to "static fields that are final and initialized by a compile-time constant expression ":
static final String = "abc"; //compile time constant
static final Object = new Object(); //initialised at runtime
In your case, the singleton will be initialised when the enum class is loaded, ie the first time enumClazz
is referenced in your code.
So it is effectively lazy, unless you have a statement somewhere in you code like this for example, which would unnecessarily initialise your singleton as part of the class loading process:
Class<?> c = enumClazz.class;
链接地址: http://www.djcxy.com/p/78834.html
上一篇: 枚举,单例和反序列化
下一篇: 通过枚举方式单例是懒惰初始化?