Java Switch 語句:常數表達式需求故障排除
在所呈現的場景中,switch 語句嘗試將整型常數與定義的靜態常數進行比對在抽象類別中。但是,編譯失敗並出現“需要常數表達式”錯誤。
可以理解,編譯時常數表達式對於 switch 語句是必需的。然而,Foo.BAR、Foo.BAZ 和 Foo.BAM 常數似乎是常數。
為什麼這些常數不被視為編譯時常數表達式?
根據 Java 語言規範 (JLS) §15.28,編譯時常數表達式僅由某些基本類型和文字組成,不包括物件 參考。在這種情況下,Foo.BAR 不是編譯時常數表達式,因為它引用靜態字段,該字段在運行時而不是編譯時初始化。
解決問題:
要解決此問題,必須使用編譯時常數初始化Foo.BA* 變數表達式:
public abstract class Foo { ... public static final int BAR = 1; public static final int BAZ = 2; public static final int BAM = 3; ... }
使用這些初始化器,編譯器可以在編譯時確定Foo.BA* 的值,使它們在switch 語句中有效。
替代使用枚舉的方法:
確保編譯時常數值的另一個選項是使用枚舉:
public enum FooConstants { BAR, BAZ, BAM }
但是,使用枚舉會施加額外的限制,例如需要預設情況並禁止計算結果為表達式的情況標籤。
以上是為什麼我的 Java Switch 語句不接受抽象類別中的靜態常數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!