Ich habe am Switch-Fall gearbeitet.
Wenn wir class.getName () verwenden, dann bekomme ich den Fehler, dass "case-Ausdrücke konstante Ausdrücke sein müssen" wie folgt:
%Vor%Auch wenn wir folgendes tun, nehmen wir den Namen der String-Klasse in eine Konstante, und erhalten dann denselben Fehler:
%Vor%Aber wenn ich folgendes tue, benutze das String-Literal "java.lang.String", es gibt keinen Fehler:
%Vor%Kann jemand bitte das erklären, warum es nicht die ersten zwei Fälle nimmt und den letzten nimmt? Vielen Dank im Voraus.
classObject.getName()
ist ein Methodenaufruf, und die Ergebnisse von Methodenaufrufen sind definitionsgemäß keine Kompilierzeitkonstanten. Ein String-Literal ist eine Kompilierzeitkonstante.
Beachten Sie, dass viele Situationen zwar einen static final
-Referenzwert als Konstante für die Lebensdauer des Programms benötigen, ein switch
jedoch seine Optionen zur Kompilierungszeit fest codieren muss. Der Wert eines case
-Ziels muss entweder ein Enum-Wert oder eine (Kompilierungszeit) ConstantExpression
.
Jedes Case-Label muss ein "konstanter Ausdruck" sein. Was "konstanter Ausdruck" ist, ist in Java Language Standard definiert, § 15.28 Konstante Ausdrücke :
Ein kompilierbarer Konstantenausdruck ist ein Ausdruck, der einen Wert des primitiven Typs oder eines Strings angibt, der nicht abrupt beendet wird und nur mit folgendem Aufbau verwendet wird:
- Literale des primitiven Typs und Literale des Typs String
...
- Einfache Namen, die sich auf konstante Variablen beziehen
Dort sind keine Methodenaufrufe aufgelistet, daher kann das Methodenaufrufergebnis nicht der Konstantenausdruck sein, auch wenn die Methode trivial ist. Aber "Einfache Namen, die sich auf konstante Variablen beziehen" sind hier aufgelistet, daher ist die Referenz auf die konstante Variable auch eine Konstante.
Ich habe am Switch-Fall gearbeitet.
Wenn wir class.getName () verwenden, dann bekomme ich den Fehler, dass "case-Ausdrücke konstante Ausdrücke sein müssen" wie folgt:
%Vor%Auch wenn wir folgendes tun, nehmen wir den Namen der String-Klasse in eine Konstante, und erhalten dann denselben Fehler:
%Vor%Aber wenn ich folgendes tue, benutze das String-Literal "java.lang.String", es gibt keinen Fehler:
%Vor%Kann jemand bitte das erklären, warum es nicht die ersten zwei Fälle nimmt und den letzten nimmt? Vielen Dank im Voraus.
Jedes Case-Label muss ein "konstanter Ausdruck" sein. Was "konstanter Ausdruck" ist, ist in Java Language Standard definiert, § 15.28 Konstante Ausdrücke :
Ein kompilierbarer Konstantenausdruck ist ein Ausdruck, der einen Wert des primitiven Typs oder eines Strings angibt, der nicht abrupt beendet wird und nur mit folgendem Aufbau verwendet wird:
- Literale des primitiven Typs und Literale des Typs String
...
- Einfache Namen, die sich auf konstante Variablen beziehen
Dort sind keine Methodenaufrufe aufgelistet, daher kann das Methodenaufrufergebnis nicht der Konstantenausdruck sein, auch wenn die Methode trivial ist. Aber "Einfache Namen, die sich auf konstante Variablen beziehen" sind hier aufgelistet, daher ist die Referenz auf die konstante Variable auch eine Konstante.
Der Grund, warum dies nicht funktioniert, ist, dass der Wert des einzuschaltenden case
bei der Kompilierung bekannt sein muss (weil er im Bytecode fest codiert und inline ist).
String.class.getName()
ist ein Methodenaufruf, der zur Laufzeit ausgewertet wird . Ja, static final
garantiert, dass es sich nach dem ersten Laden der Klasse nicht ändert. Aber das alles ist lange nach der Kompilierzeit.
Der Compiler ruft keinen Code aus dem Quellcode der Anwendung auf (möglicherweise mit Ausnahme der Annotationsverarbeitung). Es kompiliert es nur.
%code% ist ein Methodenaufruf, und die Ergebnisse von Methodenaufrufen sind definitionsgemäß keine Kompilierzeitkonstanten. Ein String-Literal ist eine Kompilierzeitkonstante.
Beachten Sie, dass viele Situationen zwar einen %code% -Referenzwert als Konstante für die Lebensdauer des Programms benötigen, ein %code% jedoch seine Optionen zur Kompilierungszeit fest codieren muss. Der Wert eines %code% -Ziels muss entweder ein Enum-Wert oder eine (Kompilierungszeit) %code% .
Tags und Links java java-8 string-literals switch-statement constants