2015-04-12 55 views
1

我在通过枚举在交换机内初始化一个变量时遇到问题。看起来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文件(我使用过Android Studio,如前所述)lintOptions,但我不能作出期望它的工作。我已经添加了下列选项中的build.gradle:

lintOptions { 
    enable 'EnumSwitchStatementWhichMissesCases' 
    abortOnError true 
} 

这并没有工作,以及,我假设,因为可能存在两个问题:

  1. 名称是错误的(我把它来自Android Studio在使用设置时创建的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.解决原来的问题。 编辑:不能这样做(感谢黑带 - 见下面的评论)
,如果没有:
2.上述选项添加到构建过程(也可以在其他用户执行的任何选项是欢迎) 。

编辑:澄清 - 我想知道如何防止枚举缺少在编译时间的情况下,在Android中使用棉绒工作室

+0

“我发现这应该可以在build.gradle文件中使用lintOptions” - 因为这不是来自Android Lint,我对此表示怀疑。您在Android Studio中配置的内容在第一次尝试中是IntelliJ IDEA检查,其中一项不属于Android Lint类别。 “应该可以将lint.xml添加到Android Studio项目中” - 再次,这不是Android Lint检查。 Android Lint专注于Android(因此,名称)。 'enum'是一种通用的Java语言结构。 – CommonsWare

+0

您可以看到是否可以配置[checkstyle插件](https://gradle.org/docs/current/userguide/checkstyle_plugin.html)以捕获此事并且构建失败。 – CommonsWare

+0

*在开关块中有一个默认标签,或者在开关表达式后有V [un]分配。 [Here](http://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html#jls-16.2.9) – Blackbelt

回答

0

这个错误来自Java编译器,而不是从一个IntelliJ IDEA的检查或Android短信。如果使用命令行Java编译器编译常规Java类(非Android),则会看到完全相同的错误。正因为如此,你没有试图解决它的工作。 EnumSwitchStatementWhichMissesCases检测检测到在这种情况下不会发生的另一种问题。

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

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

+0

感谢您的回答,但我认为您正在回答第一个问题,而且无法完成的事实已由Blackbelt在上述评论中确定,我将编辑我的问题以反映此问题。 – MikeL

0

创建一个默认情况。

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

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

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

default: 
toPrint = "error"; 
} 
+0

谢谢,但我提到我不想使用默认情况。 – MikeL

+0

出于好奇,我想知道为什么你不希望使用默认值,因为它不需要做任何事情。收益是多少?了解我在这里不会违反。我真的很好奇。 –

+0

目标是强制使用所有枚举值并获得一个错误(编译时间),否则(如果稍后添加新的),并且默认情况下不解决此问题。 – MikeL