android - 枚举中的变量初始化,或在编译时防止枚举丢失案例

标签 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. 这取决于本地配置,我想要一些可以对所有用户强制执行的东西。

第二次尝试:
我发现这应该可以通过 build.gradle 文件中的 lintOptions 实现(如前所述,我使用的是 Android Studio),但是我无法使其按预期工作。我在 build.gradle 中添加了以下选项:

lintOptions {
    enable 'EnumSwitchStatementWhichMissesCases'
    abortOnError true
}

这并没有奏效,我假设是因为两个可能的问题:

  1. 名字是错误的(我是从Android Studio在使用settings时创建的xml中拿来的)。
  2. 此问题的默认严重性是警告而非错误,但我找不到如何更改问题的严重性。

第三次尝试:
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 防止枚举在编译时丢失大小写

最佳答案

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

Java编译器之所以会报错,是因为Java支持类的单独编译。即使现在您的 switch 涵盖了枚举的所有可能情况,枚举类也有可能在稍后重新编译并包含其他条目,这些条目不会由您的 switch 处理。

因此,即使将未知的枚举条目传递给方法,您也需要确保变量已初始化。您可以通过向变量声明添加初始化器或向开关添加 default 分支(分支中的代码可以简单地抛出错误)来实现此目的。

关于android - 枚举中的变量初始化,或在编译时防止枚举丢失案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589954/

相关文章:

android - 当我尝试下载 zip 文件时,getContentLength 返回 -1

android - Google Map V21,如何以编程方式停止自动位置更新?

android-studio - Flutter:在多个包中定义颜色

android - FLUTTER:软件包安装错误:SAMSUNG 上的失败 [INSTALL_FAILED_INSUFFICIENT_STORAGE]

c# - 动态更改 C# 中枚举的值?

java - 按下按钮后 Android 模拟器屏幕变为空白

android - 为什么我们可以通过BroadcastReceiver 与BLE 设备配对,而不显示系统Dialog?

android - 如何在Android中的另一个模块中调用一个Activity(属于一个模块)?

swift - 如何在具有关联值的枚举上使用 OR 运算符进行模式匹配?

java - 如何强制属性等于常量值之一(在 Java 中)?