2013-01-13 7 views
12

Ho un final class Ring definito come:Le espressioni di caso devono essere espressioni costanti per static final int?

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

Ho anche un public class MorrisBoard con il seguente codice:

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 riferimenti una variabile che è immutabile per tutta la durata del programma. Tutti i valori sono definitivi

Tuttavia, ho ancora il seguente errore: case expressions must be constant expressions. Sono confuso da questo - MorrisBoard.RING.OUT è un'espressione costante.

Cosa sta succedendo qui?

+0

Si deve essere una costante di tempo _compile_ e 'RING' no, è assegnata in fase di runtime. –

+4

Nota: si consideri l'uso di un 'enum' invece di un gruppo di' statico finale' ... –

+3

Non è necessario creare un'istanza di una classe che non ha membri di istanze, ovvero solo membri statici –

risposta

16

Sostituire

case MorrisBoard.RING.OUT: 

con

case Ring.OUT: 

Quindi questa sarà davvero una costante come in "determinato alla compilation".

La specifica precises che un "SwitchLabel" deve essere

  • case seguita da un'espressione costante
  • case seguito dal nome di un valore di enumerazione
  • o default

Nei è considerata un'espressione costante valida è described here in the specification. È abbastanza limitato.

+0

Cosa succederà quando la classe finale Ring non è statica? – Hurda

+0

In questo caso particolare, lo è, quindi questa è una risposta appropriata (grazie!). Tuttavia, sarei curioso di sapere come sarebbe gestito. – Zyerah

+0

@Hurda Se non puoi fare riferimento alla costante definita esternamente semplicemente con 'TypeName.Identifier', allora non è valido. –

0

semplice soluzione per questo problema è: Clicca l'interruttorequindi premere CTL + 1, Cambierà la vostra interruttore per if-else blocco di istruzioni, e risolverà il problema