page contents

枚举式单例如何创建实例的?

Pack 发布于 2020-01-14 16:22
阅读 955
收藏 0

虽说线程安全性,防止反射破坏,防止序列化破坏这些知识点明白了,但是由于平时几乎没用过枚举类,所以始终不明白枚举类创建单例的原理,课程前一部分内容介绍的单例模式都有new Singleton()这一步来创建实例和赋值,到了枚举类里就没了这一步。枚举单例类的代码中返回返回的是INSTANCE,INSTANCE的值是什么?从哪来的?INSTANCE和obj之间的关系是什么? 

attachments-2020-01-yVRXVEW85e1d7a1f61706.png

最佳答案 2020-03-24 17:14

186
Pack
Pack

源码:

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
        });
    }
}
请先 登录 后评论