2013-01-13 8 views
12

Ich habe eine final class Ring wie folgt definiert:Case-Ausdrücke müssen konstante Ausdrücke für statische final int sein?

final class Ring { 
    public static final int OUT = 3; 
    public static final int MID = 2; 
    public static final int IN = 1; 
} 

ich auch eine public class MorrisBoard mit dem folgenden Code haben:

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 Referenzen eine Variable, die für die Laufzeit des Programms unveränderlich ist. Alle Werte sind endgültig.

Allerdings bekomme ich immer noch den folgenden Fehler: case expressions must be constant expressions. Ich bin dadurch verwirrt - MorrisBoard.RING.OUT ist ein konstanter Ausdruck.

Was ist hier los?

+0

Es lösen müssen Eine _Compile-Zeitkonstante_ und "RING" ist nicht, sie wird zur Laufzeit zugewiesen. –

+4

FYI: Erwägen Sie, eine 'enum' statt einer Reihe von' final static' zu verwenden ... –

+3

Es ist nicht notwendig, eine Instanz einer Klasse zu erstellen, die keine Instanz Mitglieder hat, dh nur statische Mitglieder –

Antwort

16

ersetzen

case MorrisBoard.RING.OUT: 

mit

case Ring.OUT: 

Also das ist wirklich eine Konstante wie in "bestimmt bei der Kompilierung" sein wird.

Die Spezifikation precises, die ein "SwitchLabel"

  • case durch einen konstanten Ausdruck
  • case durch den Namen eines ENUM-Wert
  • oder default

gefolgt gefolgt sein muss Was gilt als gültige konstante Ausdruck ist described here in the specification. Es ist ziemlich begrenzt.

+0

Machst du das funktioniert, wenn letzte Klasse Ring nicht statisch ist? – Hurda

+0

In diesem speziellen Fall ist dies eine angemessene Antwort (Danke!). Ich wäre jedoch gespannt, wie das gehandhabt würde. – Zyerah

+0

@Hurda Wenn Sie nicht einfach mit 'TypeName.Identifier' auf Ihre extern definierte Konstante verweisen können, ist sie nicht gültig. –

0

Einfache Lösung für dieses Problem ist: Klicken Sie auf den Schalter und dann CTL + 1, drücken Es wird Ihr Schalter if-else-Block-Anweisung zu ändern, und Ihr Problem

Verwandte Themen