虽说线程安全性,防止反射破坏,防止序列化破坏这些知识点明白了,但是由于平时几乎没用过枚举类,所以始终不明白枚举类创建单例的原理,课程前一部分内容介绍的单例模式都有new Singleton()这一步来创建实例和赋值,到了枚举类里就没了这一步。枚举单例类的代码中返回返回的是INSTANCE,INSTANCE的值是什么?从哪来的?INSTANCE和obj之间的关系是什么?
虽说线程安全性,防止反射破坏,防止序列化破坏这些知识点明白了,但是由于平时几乎没用过枚举类,所以始终不明白枚举类创建单例的原理,课程前一部分内容介绍的单例模式都有new Singleton()这一步来创建实例和赋值,到了枚举类里就没了这一步。枚举单例类的代码中返回返回的是INSTANCE,INSTANCE的值是什么?从哪来的?INSTANCE和obj之间的关系是什么?
源码:
public enum ColorX {
RED, GREEN, BLUE;
}
编译后再反编译:
public final class ColorX extends Enum
{
public static ColorX[] values()
{
return (ColorX[])$VALUES.clone();
}
public static ColorX valueOf(String name)
{
return (ColorX)Enum.valueOf(enum01/ColorX, name);
}
private ColorX(String s, int i)
{
super(s, i);
}
public static final ColorX RED;
public static final ColorX GREEN;
public static final ColorX BLUE;
private static final ColorX $VALUES[];
static
{
RED = new ColorX("RED", 0);
GREEN = new ColorX("GREEN", 1);
BLUE = new ColorX("BLUE", 2);
$VALUES = (new ColorX[] {
RED, GREEN, BLUE
});
}
}