2015-04-12 98 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