page contents

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

Pack 发布于 2019-12-26 15:36
阅读 645
收藏 0

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

attachments-2019-12-DplqlA7Q5e0462e8a68bc.png


32
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

        });

    }

}

请先 登录 后评论