我说这个枚举类型的颜色如下:
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
字段的初始化发生时。它应该在完整的枚举列表完成后发生。我不会很快看到它发生,但我仍然想确定。
答案 0 :(得分:5)
是的,此初始化将始终有效。枚举常量始终首先列出,JLS, Section 8.9.3保证它们将在任何其他正常static
变量之前初始化。
对于在E声明的主体中声明的每个枚举常量c,E具有隐式声明的类型为E的公共静态最终字段,其与c具有相同的名称。该字段具有由c组成的变量初始值设定项,并使用与c。
相同的注释进行注释在E声明的主体中显式声明的任何静态字段之前,这些字段以与相应枚举常量相同的顺序隐式声明。
所有static
字段都按顺序进行初始化,就像它们是单个文本块一样,因此在Values
初始化之前,所有枚举常量都将通过调用values()
进行初始化。
顺便提一下,static final
变量通常以全部大写字母命名,例如VALUES
,符合标准Java命名约定。