[英]Switch Case statement Using Class level Variable
如何使用類級別變量使用 switch case 語句。
@Value("${user.name}")
private static final String userName = "xyz";
public static void main(String[] args) {
String nn = "xyz";
switch (nn) {
case userName:
System.out.println("It Works!!");
}
}
在上面的示例中,我有一個名為“userName”的類級別變量,它從屬性文件中檢索值。 要在 switch case 語句中使用此字段,我必須將其設為 final 並分配一個值,但它不執行 case 語句。 如何在 switch case 語句中使用類級別變量?
case userName:
表達式 ( userName
) 必須是一個(編譯時)常量 expression 。
如果userName
是這樣聲明的:
private static final String userName = "xyz";
那么userName
是一個(編譯時)常量表達式。
但是如果像userName
這樣的String
變量不是final
,或者它有一個空白的初始值設定項,或者它被初始化為方法調用的結果......或者其他一些事情......那么它不是(編譯時) 常量表達式。
閱讀JLS 15.28了解常量表達式的完整標准集。
那么我該如何解決我的問題呢? 我正在嘗試解決“認知復雜性”聲納問題,我正在為對象列表運行 for 循環並根據 for 循環對象的元素設置新的對象變量。 我不想使用 if else 語句,這就是為什么在遇到此問題之前一直嘗試切換 case 語句的原因。
現在我們要解決真正的問題了!!
您需要的是比 if/else 鏈更簡單但在字符串(例如單詞)是動態的時仍然有效的東西。 Switch 語句不起作用1 。
這是一個想法:
private static HashMap<String, Something> map = new HashMap<>();
// populate map for each word.
// then
String word = ...
Something something = map.get(word);
if (something) {
// use it.
}
Something
可以是自定義對象,也可以是功能對象類型……以便您可以使用 lambda 填充映射。
這種方法比(假設的)字符串switch
語句更冗長,但性能應該大致相同。 它是否更具可讀性取決於上下文以及誰在閱讀代碼。
另一方面,忽略聲納警告可能更合適。 Sonar 基於一些相當粗略的啟發式方法為您提供有關代碼質量的建議。 它不理解代碼,也不理解人們(程序員)的想法。
1 - ... 除非您生成源代碼並在運行時編譯它。 除非確實有必要,否則您應該避免這種復雜性。
它不會執行您的 case 語句,因為您的 switch 變量 nn 的值是“abcd”,而在您的 case 變量 userName 其“xyz”中,它正在尋找“abcd”案例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.