在带有 ENUM 和 FINAL 变量的 Switch 语句的情况下出现编译错误?
Getting Compile error in case of Switch statement with ENUM and FINAL variable?
我遇到了一个奇怪的问题。
我声明了一个 Static Final 变量但没有初始化。
我有一个私有方法 xyz(),其中有一个 Switch 语句。
但我打赌编译时错误:"The final field ABC cannot be assigned" - "Remove the final modifier of ABC".
P.S。 switch case 正在检查从 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;
}
}
您的字段是 static
和 final
.
这意味着该字段处于Class
级别,而不是实例级别。并且该字段必须分配一次 - 在 static
字段的情况下,它通常在 Class
初始化期间分配。
没有什么可以阻止你做的:
public MyClass() {
xyz();
xyz();
}
即在构造函数中调用 xyz
两次,以便它尝试为每个实例分配 ABC
。这显然使 ABC
不是 static final
- 也不是实例 final
因为它被分配了两次。
更糟糕的是,您可以从任意实例方法调用 zyx()
。
您必须确保每个 Class
实例只分配一次 ABC
,即当 ClassLoader
加载 class
.
您需要执行以下操作:
private static String xyz(){
switch(ENUMImpl.getCountry()) {
case COUNTRY1:
return "TMZ";
default:
return "NA";
}
}
static {
ABC = xyz();
}
注:
- 您的格式非常难看,发帖前请在您的 IDE 中使用自动格式。
ENUMImpl
是一个 糟糕的 名称。它显然是一个 enum
,正如它声明的那样,它显然是一个实现,否则它不会存在。所以这绝对不会告诉你它的目的。
我遇到了一个奇怪的问题。
我声明了一个 Static Final 变量但没有初始化。 我有一个私有方法 xyz(),其中有一个 Switch 语句。
但我打赌编译时错误:"The final field ABC cannot be assigned" - "Remove the final modifier of ABC".
P.S。 switch case 正在检查从 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;
}
}
您的字段是 static
和 final
.
这意味着该字段处于Class
级别,而不是实例级别。并且该字段必须分配一次 - 在 static
字段的情况下,它通常在 Class
初始化期间分配。
没有什么可以阻止你做的:
public MyClass() {
xyz();
xyz();
}
即在构造函数中调用 xyz
两次,以便它尝试为每个实例分配 ABC
。这显然使 ABC
不是 static final
- 也不是实例 final
因为它被分配了两次。
更糟糕的是,您可以从任意实例方法调用 zyx()
。
您必须确保每个 Class
实例只分配一次 ABC
,即当 ClassLoader
加载 class
.
您需要执行以下操作:
private static String xyz(){
switch(ENUMImpl.getCountry()) {
case COUNTRY1:
return "TMZ";
default:
return "NA";
}
}
static {
ABC = xyz();
}
注:
- 您的格式非常难看,发帖前请在您的 IDE 中使用自动格式。
ENUMImpl
是一个 糟糕的 名称。它显然是一个enum
,正如它声明的那样,它显然是一个实现,否则它不会存在。所以这绝对不会告诉你它的目的。