Java枚举静态最终实例变量
胡萨 这段代码运行了一段时间,然后我决定添加默认颜色,它停止了工作。我得到以下错误:Java枚举静态最终实例变量,java,static,enums,compiler-errors,final,Java,Static,Enums,Compiler Errors,Final,胡萨 这段代码运行了一段时间,然后我决定添加默认颜色,它停止了工作。我得到以下错误: 1 error found: File: Status.java [line: 20] Error: Status.java:20: illegal reference to static field from initializer 在编译时使用以下代码 import java.awt.Color; enum Status { OFF ("Off"), TRAINING ("Training",
1 error found:
File: Status.java [line: 20]
Error: Status.java:20: illegal reference to static field from initializer
在编译时使用以下代码
import java.awt.Color;
enum Status
{
OFF ("Off"),
TRAINING ("Training", new Color(255, 191, 128)),
BEGINNER ("Beginner", new Color(128, 255, 138)),
INTERMEDIATE ("Intermediate", new Color(128, 212, 255)),
ADVANCED ("Advanced", new Color(255, 128, 128));
public final String name;
public final Color color;
public static final Color defaultColor = Color.WHITE;
Status(String name)
{
this(name, defaultColor);
}
Status(String name, Color color)
{
this.name = name;
this.color = color;
}
}
据我所知,这应该是可行的,但不管出于什么原因,Java决定抛出一个错误。
有什么想法吗?必须首先初始化枚举常量。要初始化它们,必须调用构造函数。第一个构造函数引用的静态字段在调用时可能尚未初始化。和
defaultColor
仅在调用构造函数后初始化,因此在调用该构造函数之前,它将具有其默认值(null)。一种选择是将默认颜色置于嵌套类型中:
import java.awt.Color;
enum Status
{
OFF ("Off"),
TRAINING ("Training", new Color(255, 191, 128)),
BEGINNER ("Beginner", new Color(128, 255, 138)),
INTERMEDIATE ("Intermediate", new Color(128, 212, 255)),
ADVANCED ("Advanced", new Color(255, 128, 128));
public final String name;
public final Color color;
Status(String name)
{
this(name, Defaults.COLOR);
}
Status(String name, Color color)
{
this.name = name;
this.color = color;
}
private static class Defaults
{
private static Color COLOR = Color.WHITE;
}
}
当然,如果您在代码中只引用了一次默认颜色,那么您也可以在构造函数调用中对其进行硬编码:
Status(String name)
{
this(name, Color.WHITE);
}
Java允许这样做
class Status
{
public static final Status OFF = new Status("Off");
public static final Color defaultColor = Color.WHITE;
Status(String name)
{
this(name, defaultColor);
}
}
当然,它在运行时会有问题,但Java不在乎。程序员的工作是安排init序列,编译器不容易检查所有损坏的init依赖项。无论如何,问题很容易解决:
class Status
{
// now it works, this field is initialized first
public static final Color defaultColor = Color.WHITE;
public static final Status OFF = new Status("Off");
但是对于enum
,此解决方法不适用,因为enum
类型中的静态字段不能在枚举本身之前移动(可能纯粹是出于语法原因)。为了避免混淆,Java为enum
添加了一个额外的限制-静态字段不能从构造函数中引用
这项限制未获通过。检查构造函数中静态字段的所有可能用法并不容易(如果不是不可能的话)。将编译以下代码,以克服限制:
enum Status
{
OFF("Off");
public static final Color defaultColor = Color.WHITE;
static Color defaultColor(){ return defaultColor; }
Status(String name)
{
this(name, defaultColor());
}
您链接的错误指的是访问枚举类的
.class
文本,而不是引用枚举的实际静态字段。是否有理由使用defaultColor
字段?您的代码的其余部分不应该只查看Status.color
?