Java

时间:2015-04-24 23:02:20

标签: java enums static initialization final

我说这个枚举类型的颜色如下:

public enum Colour
{
    RED, GREEN, BLUE;
}

我希望根据那里的建议随机化这三种颜色:https://stackoverflow.com/a/8114214/2736228

但我不想一遍又一遍地打电话给values(),所以,我想出了如下内容:

public enum Colour
{
    RED, GREEN, BLUE;

    private static final Colour[] Values = values();

    public static Colour random()
    {
        return Values[(int) (Math.random() * Values.length)];
    }
}

问题是,它会一直有效吗?

让我感到困惑的是,当这个private static final字段的初始化发生时。它应该在完整的枚举列表完成后发生。我不会很快看到它发生,但我仍然想确定。

1 个答案:

答案 0 :(得分:5)

是的,此初始化将始终有效。枚举常量始终首先列出,JLS, Section 8.9.3保证它们将在任何其他正常static变量之前初始化。

  

对于在E声明的主体中声明的每个枚举常量c,E具有隐式声明的类型为E的公共静态最终字段,其与c具有相同的名称。该字段具有由c组成的变量初始值设定项,并使用与c。

相同的注释进行注释      

在E声明的主体中显式声明的任何静态字段之前,这些字段以与相应枚举常量相同的顺序隐式声明。

所有static字段都按顺序进行初始化,就像它们是单个文本块一样,因此在Values初始化之前,所有枚举常量都将通过调用values()进行初始化。

顺便提一下,static final变量通常以全部大写字母命名,例如VALUES,符合标准Java命名约定。