Java Switch-Anweisung: Fehlerbehebung bei Anforderungen an konstante Ausdrücke
Im dargestellten Szenario versucht eine Switch-Anweisung, eine ganzzahlige Konstante mit definierten statischen Konstanten abzugleichen in einer abstrakten Klasse. Die Kompilierung schlägt jedoch mit der Fehlermeldung „Konstanter Ausdruck erforderlich“ fehl.
Verständlicherweise sind für Switch-Anweisungen konstante Ausdrücke zur Kompilierungszeit erforderlich. Dennoch scheinen die Konstanten Foo.BAR, Foo.BAZ und Foo.BAM konstant zu sein.
Warum werden diese Konstanten nicht als konstante Ausdrücke zur Kompilierungszeit behandelt?
Gemäß der Java Language Specification (JLS) §15.28 besteht ein konstanter Ausdruck zur Kompilierungszeit nur aus bestimmten primitiven Typen und Literalen, ausgenommen Objektreferenzen. In diesem Fall ist Foo.BAR kein konstanter Ausdruck zur Kompilierungszeit, da er sich auf ein statisches Feld bezieht, das zur Laufzeit und nicht zur Kompilierungszeit initialisiert wird.
Behebung des Problems:
Um dieses Problem zu beheben, müssen die Foo.BA*-Variablen mit konstanten Ausdrücken zur Kompilierungszeit initialisiert werden:
public abstract class Foo { ... public static final int BAR = 1; public static final int BAZ = 2; public static final int BAM = 3; ... }
Mit diesen Initialisierer kann der Compiler die Werte von Foo.BA* zur Kompilierungszeit ermitteln und sie für die Verwendung in einer Switch-Anweisung gültig machen.
Alternativer Ansatz mit Aufzählungen:
Eine weitere Möglichkeit, konstante Werte zur Kompilierungszeit sicherzustellen, ist die Verwendung von Enumerationen:
public enum FooConstants { BAR, BAZ, BAM }
Die Verwendung von Enumerationen ist jedoch mit einigen Einschränkungen verbunden Zusätzliche Einschränkungen, wie z. B. das Erfordernis einer Standard-Groß-/Kleinschreibung und das Verbot von Groß-/Kleinschreibungsbeschriftungen, die zu Ausdrücken ausgewertet werden.
Das obige ist der detaillierte Inhalt vonWarum akzeptiert meine Java-Switch-Anweisung keine statischen Konstanten aus einer abstrakten Klasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!