2017-07-26 91 views
0

java支持切換一個字符串,但是在case字段中,如何使用一個常量字符串? 像這樣:爲什麼public static final string不能用在java開關

PhxLog l = new PhxLog();   
for (String s : l.FIELDS) { 
     Object v = mapBaseData.getData().get(s); 
      switch (s) { 
       case l.LOG_FIELD_TIME: // this is wrong, but how to use a constant instead of a "xxxx" 
        l.setTime((String)v); 
        break; 
+4

請顯示'l'的定義,它是類和'LOG_FIELD_TIME'的值。如果你真的想在這裏切換,爲什麼不枚舉? –

+1

爲什麼你的代碼不能正常工作?似乎在這裏工作。 http://ideone.com/tiS3RA –

+1

我做了一個快速測試。如果'l'是對'ClassOfL'的引用,並且''ClassOfL''中的'LOG_FIELD_TIME'被定義爲'private static final String',那麼'case ClassOfL.LOG_FIELD_TIME:..'應該可以工作。 –

回答

2

(幸得EJP的答案)

JLS,它提到,你把情況下表達必須是一個常量表達式。

有不同形式的常量表達式和字符串的常數是在列表中:表單類型名的

合格的名稱(§6.5.6.2)。 引用常量變量(§4.12.4)的標識符。

從你的代碼,它給出了一個暗示,l.LOG_FIELD_TIME不符合要求,因爲l不是TypeName(由for (String s : l) {暗示)。如果LOG_FIELD_TIME確實是static final字段,則應該使用ClassNameOfL.LOG_FIELD_TIME來代替,並且該東西應該可以工作。

+1

借用@ cricket_007的[示例](https://stackoverflow.com/questions/45316277/why-public-static-final-string-can-not-used-in-java-switch#comment77595204_45316277):http:/ /ideone.com/DFNu7w – shmosel

+0

謝謝。將l.LOG_FIELD_TIME更改爲PhxLog.LOG_FIELD_TIME,它可以工作。 – soma

+0

考慮接受答案,如果它回答你的問題。 –

-2

如何使用,而不是一個 「XXXX」

你可以不是一個常數。 JLS 14.11

每個case標籤都有一個case常量,它是一個常量表達式或一個枚舉常量的名稱。

static final String的名稱不是一個常量表達式。正如它所說,你可以使用enum

+0

所以我們現在下調了JLS? – EJP

+0

只是在這裏好奇。使用靜態最終字符串是否與'case Math.PI'不同? –

+0

@ cricket_007我看不出如何,因爲措辭。 – EJP

相關問題