首頁 >Java >java教程 >為什麼我的 Java Switch 語句不接受抽象類別中的靜態常數?

為什麼我的 Java Switch 語句不接受抽象類別中的靜態常數?

Patricia Arquette
Patricia Arquette原創
2024-12-19 21:29:13927瀏覽

Why Doesn't My Java Switch Statement Accept Static Constants from an Abstract Class?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn