【问题标题】:Getting Compile error in case of Switch statement with ENUM and FINAL variable?在带有 ENUM 和 FINAL 变量的 Switch 语句的情况下出现编译错误?
【发布时间】:2015-09-08 09:25:36
【问题描述】:

我遇到了一个奇怪的问题。

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

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

附: 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;
  }
}

【问题讨论】:

  • final 字段只能直接赋值或使用静态初始化器。

标签: java enums switch-statement final


【解决方案1】:

您的字段是 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();
}

注意:

  1. 你的格式很丑,发帖前请在你的IDE中使用自动格式。
  2. ENUMImpl 是一个可怕的名字。它显然是一个enum,因为它如此声明并且它显然是一个实现,否则它就不会存在。所以这绝对不能告诉你它的目的。

【讨论】:

  • 感谢您的快速回复。
  • 是的,我刚刚开始使用stackoverflow;所以下次发帖时我会记住您的所有建议。
  • @anirbandebnath 这些是对您的一般编码的建议。如果我的一位开发人员提出ENUMImpl,他们将不得不从头到尾再次阅读Clean Code。
  • @anirbandebnath,如果这回答了你的问题,别忘了accept this answer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多