枚举内的变量初始化,或者在编译时防止枚举丢失

时间:2015-04-12 13:22:02

标签: android android-studio enums gradle lint

我遇到一个变量问题,该变量正在枚举内的交换机内进行初始化。似乎Android Studio(和Eclipse)忽略了我在所有情况下初始化变量的事实,并声明:“变量'x'可能尚未初始化”。我不想提出默认案例。

代码示例:

public enum  eTest {
    One,
    Two
}


public class Test {
    public void method(eTest value) {
        String toPrint;

        switch (value) {
            case One:
                toPrint = "One";
                break;
            case Two:
                toPrint = "Two";
                break;
        }

        System.out.println(toPrint); // <-- said error
    }
}

我不想初始化变量,但我不确定有没有办法在没有初始化的情况下执行此操作(我来了解我错了)。 假设这是不可能的,我想确保新的枚举值添加到此开关。

首先尝试:
I've tried adding the "Enum 'switch' statement that misses case" to the Android Studio settings,但这有两个问题:

  1. 它不会使构建失败(仅显示带有红色标记的位置)。
  2. 这取决于本地配置,我希望能够对所有用户强制执行。
  3. 第二次尝试:
    我发现这应该可以在build.gradle文件中使用lintOptions(我正在使用Android Studio,如上所述),但是我无法使其按预期工作。我在build.gradle中添加了以下选项:

    lintOptions {
        enable 'EnumSwitchStatementWhichMissesCases'
        abortOnError true
    }
    

    这不起作用,我假设是因为两个可能的问题:

    1. 名称错误(我从Android Studio使用设置时创建的xml中获取了它。)
    2. 此问题的默认严重性为警告而非错误,但我找不到如何更改问题的严重性。
    3. 第三次尝试:
      It should be possible to add a lint.xml to the Android Studio project,我也尝试了这个,但它没有使构建失败,所以我假设我在那里做错了。我将以下内容放在AndroidManifest位置:

      <?xml version="1.0" encoding="UTF-8"?>
      <lint>
          <issue id="EnumSwitchStatementWhichMissesCases" severity="error" />
      </lint>
      

      此外:
      我见过this answer,但这不是我想要的,因为这是关于特定的构建过程,我希望有更好的解决方案。

      问题:
      有可能:

      1.解决原始问题。 编辑:这是不可能的(感谢Blackbelt - 请参阅下面的评论)
      如果没有:
       2.将所述选项添加到构建过程(欢迎​​可以对其他用户强制执行的任何选项)。

      编辑澄清 - 我想知道在Android Studio中使用lint,如何防止在编译时丢失案例的枚举

2 个答案:

答案 0 :(得分:1)

此错误来自Java编译器,而不是来自IntelliJ IDEA检查或Android linter。如果使用命令行Java编译器编译常规Java类(非Android),您将看到完全相同的错误。因此,您没有尝试修复它。 EnumSwitchStatementWhichMissesCases检查会检测到在这种情况下不会发生的其他类型的问题。

Java编译器将此报告为错误的原因是因为Java支持单独编译类。即使现在您的开关涵盖了枚举的所有可能情况,但是枚举类可能会在以后重新编译,并且将包含其他条目,这些条目将不会被您的交换机处理。

因此,即使将未知的枚举条目传递给方法,也需要确保变量已初始化。您可以通过向变量声明添加初始化程序或向交换机添加default分支来执行此操作(分支中的代码只会引发错误)。

答案 1 :(得分:0)

创建默认案例。

enum myEnum(one, two, error)
String toPrint;

switch (myEnum)
{
case(one):
toPrint = "one";
break;

case (two):
toPrint = "two";
break;

default:
toPrint = "error";
}