在使用ENUM和FINAL变量的Switch语句的情况下获取编译错误?

时间:2015-09-08 09:25:36

标签: java enums switch-statement final

我面临一个奇怪的问题。

我声明了一个静态最终变量但未初始化。 我有一个私有方法xyz(),其中我有一个Switch语句。

但我打赌编译时错误:“无法分配最终字段ABC” - “删除ABC的最终修饰符”。

P.S。开关盒检查从ENUM返回的值

请帮助我。

以下是代码: -

private static final String ABC;
private void xyz(){
switch(ENUMImpl.getCountry()){         //** ENUMImpl is an ENUM class with a method getCountry() which returns the ENUM value

case COUNTRY1:
        ABC = "TMZ"; // The final field ABC cannot be assigned :: Remove final modifier of ABC
        break;
default:
        ABC = "NA";
        break;
  }
}

1 个答案:

答案 0 :(得分:2)

您的字段 static final

这意味着该字段处于Class级别,而不是实例级别。该字段必须分配一次 - 如果是static字段,则会在Class初始化期间分配很多字段。

没有什么可以阻止你做的:

public MyClass() {
    xyz();
    xyz();
}

即。在构造函数中调用xyz两次,以便它尝试为每个实例分配ABC。这显然使ABC不是static final - 也不是实例final,因为它被分配了两次。

更糟糕的是,您可以从任意实例方法中调用zyx()

您必须确保ABC每个Class个实例只分配一次,即ClassLoader加载class时。{/ p>

您需要执行以下操作:

private static String xyz(){
    switch(ENUMImpl.getCountry()) {
        case COUNTRY1:
            return "TMZ";
        default:
            return "NA";
    }
}

static {
    ABC = xyz();
}

注意:

  1. 您的格式非常难看,请在发布前在IDE中使用自动格式。
  2. ENUMImpl是一个可怕的名称。它显然是enum,因为它声明为它,它显然是一个实现,否则它将不存在。所以这绝对没有告诉你它的目的。