簡體   English   中英

使用類級別變量的 Switch Case 語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM