Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java枚举静态最终实例变量_Java_Static_Enums_Compiler Errors_Final - Fatal编程技术网

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