我面临一个奇怪的问题。
我声明了一个静态最终变量但未初始化。 我有一个私有方法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;
}
}
答案 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();
}
注意:
ENUMImpl
是一个可怕的名称。它显然是enum
,因为它声明为它,它显然是一个实现,否则它将不存在。所以这绝对没有告诉你它的目的。