2013-01-13 14 views
12

mam final class Ring zdefiniowany jako:Przypadki wyrażeń muszą być wyrażeniami stałymi dla statycznego ostatecznego int?

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

również mieć public class MorrisBoard następującym kodem:

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 odniesienia zmienną, która jest stała w czasie trwania programu. Wszystkie wartości są ostateczne.

Jednak nadal pojawia się następujący błąd: case expressions must be constant expressions. Jestem zdezorientowany tym - MorrisBoard.RING.OUT jest wyrażeniem stałym.

Co się tutaj dzieje?

+0

To musi być stała czasowa _kompilacji_, a "RING" nie jest, jest przypisana w czasie wykonywania. –

+4

FYI: Rozważ użycie 'wyliczenia' zamiast pęczka' ostatecznego statycznego' ... –

+3

Nie ma potrzeby tworzenia instancji klasy, która nie ma żadnych członków instancji, tj. Tylko statycznych członków –

Odpowiedz

16

Wymień

case MorrisBoard.RING.OUT: 

z

case Ring.OUT: 

więc będzie to naprawdę być stała jak w "ustalona na kompilacji".

Specyfikacja precises że "SwitchLabel" musi być

  • case następnie stałej ekspresji
  • case następnie imię wartości enum
  • lub default

Co jest uważane za poprawne wyrażenie stałe to described here in the specification. Jest dość ograniczony.

+0

Czy uważasz, że to zadziała, kiedy ostateczny pierścień klasy nie jest statyczny? – Hurda

+0

W tym konkretnym przypadku jest, więc jest to odpowiednia odpowiedź (dziękuję!). Chciałbym jednak wiedzieć, jak to się stanie. – Zyerah

+0

@Hurda Jeśli nie możesz odwołać się do swojej zdefiniowanej zewnętrznie stałej po prostu za pomocą 'TypeName.Identifier', to nie jest to poprawne. –

0

Proste rozwiązanie dla tego problemu jest: Kliknij na przełączniku a następnie naciśnij CTL + 1, Będzie to zmienić przełącznik if-else bloku i będzie rozwiązać problem