2017-03-06 4 views
1

Gemäß Wikipedia ist die leere letzte Variable eine letzte Variable, deren Deklaration zum Zeitpunkt der Definition einen Initialisierer fehlt.Switch-Anweisung mit leeren endgültigen Variablen

Gleichzeitig müssen die Werte für die Switch-Case-Anweisung konstante Werte für die Kompilierungszeit sein.

Gemäß über zwei Bestätigungen, würde ich beide der folgenden Code-Schnipsel erwarten ohne Probleme zu kompilieren, aber nur der erste tut:

final int y = 1; 

    switch(1) { 
     case y: 
    } 

und

final int y; 
    y = 1; 
    switch(1) { 
     case y: 
    } 

Sollte nicht haben Java-Compiler führen eine Flussanalyse im zweiten Beispiel durch, um sicherzustellen, dass eine leere finale Variable zugewiesen wird und der Code somit fehlerfrei kompiliert wird?

+0

Check diese Antwort https://stackoverflow.com/questions/3827393/java-switch-statement-constant-expression-required-but-it-is-constant#3827424 tatsächlich, scheint wie Duplikat dieser Frage –

Antwort

0

Der Switch-Fall erfordert einen konstanten Ausdruck. Im ersten Beispiel ersetzt der Compiler die Initialisierung durch eine Konstante, die dann anstelle aller y-Variablen verwendet wird. Der Compiler kann dies im zweiten Fall nicht tun.

0

Sie haben also die Fehlermeldung constant expression required. Von JLS 15.28: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 Konstanter Ausdruck kann ein einfacher Name sein, der sich auf eine konstante Variable bezieht. Wiederum von JLS http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4:

Ein leeres Finale ist eine letzte Variable, deren Deklaration einen Initialisierer fehlt.

Eine konstante Variable ist eine letzte Variable des primitiven Typs oder Typs String, die mit einem konstanten Ausdruck initialisiert wird (§15.28). Ob eine Variable eine konstante Variable ist oder nicht, kann Auswirkungen auf die Klasseninitialisierung (§12.4.1), die Binärkompatibilität (§13.1, §13.4.9) und die eindeutige Zuweisung (§16 (Definite Assignment)) haben.

Also, im ersten Fall ist y eine konstante Variable, und im zweiten Fall ist es eine leere Variable. Deshalb können Sie es nicht für den Fall verwenden.

Verwandte Themen