2013-01-13 122 views
12

我有一個final class Ring定義爲:Case表達式必須是static final int的常量表達式嗎?

​​

我也有以下代碼public class MorrisBoard

public class MorrisBoard { 
    public static final Ring RING = new Ring(); 

    private boolean checkMillBy(int ring, int x, int y) { 
    switch(ring) { 
    case MorrisBoard.RING.OUT: 
     //... 
    case MorrisBoard.RING.MID: //etc. 
     //... 
    } 
    return false; 
} 

MorrisBoard.RING.OUT引用的變量而言是不可變的程序的生命週期。所有的值都是最終的。

但是,我仍然收到以下錯誤:case expressions must be constant expressions。我很困惑 - MorrisBoard.RING.OUT是一個常數表達式。

這是怎麼回事?

+0

它必須是一個_compile時間常數_和'RING'不是,它是在運行時分配的。 –

+4

僅供參考:考慮使用'enum'而不是一堆'final static' ... –

+3

沒有必要創建一個沒有任何實例成員的類的實例,即只有靜態成員 –

回答

16

更換

case MorrisBoard.RING.OUT: 

case Ring.OUT: 

所以這真的會是一個常量,如 「在編譯時確定」。

說明書precises,一個 「SwitchLabel」 必須是

  • case後跟一個常量表達式
  • case接着枚舉值的名稱
  • default

什麼被認爲是一個有效的常數表達式是described here in the specification。這是相當有限的。

+0

當最終的類Ring不是靜態的時候,這樣做會起作用嗎? – Hurda

+0

在這種特殊情況下,它是,所以這是一個合適的答案(謝謝!)。但是,我很想知道如何處理。 – Zyerah

+0

@Hurda如果你不能簡單地用'TypeName.Identifier'來引用你的外部定義的常量,那麼它是無效的。 –

0

對於這個問題簡單的解決方案是: 單擊開關,然後按CTL + 1,將交換機更改爲的if-else語句塊,並且將解決問題