當編寫帶有很多條件的代碼時,您肯定使用過if-elseswitch語句。但是這種替代if-else的方法有缺點。有些人甚至稱switch語句為“反模式”。

那是什麼?反模式是錯誤代碼的常見模式,即問題的錯誤解決方案。程序員試圖在代碼中避免它們,因為它們會降低代碼質量。

但有個好消息:新版本的 Java 對該語言的語法進行了大量更改,其中一項更改會影響switch。感興趣嗎?那麼讓我們開始吧。

首先,有必要澄清一下為什麼switch是一種反模式。考慮以下代碼:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

好的,所以目前還不完全清楚為什麼這是一個“反模式”。

但是如果我們添加更多的case塊,現在代碼看起來像這樣:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

讓我們再添加幾行——代碼變長了。以後我們可以添加越來越多的行,沒有人會阻止我們這樣做。

這就是問題的核心所在:在最初創建了一個緊湊的switch語句之後,我們向其中添加了越來越多的代碼,佔用了越來越多的空間——超過了屏幕上顯示的空間——並且使代碼不便於閱讀和維護。

switch語句和switch表達式的區別

Java 14 引入了一個新的和改進的開關。它不是switch 語句,而是switch 表達式

你問有什麼區別?不同之處在於,語句是執行一組特定操作的指令,而表達式是執行某些計算並返回結果的一段代碼。

換句話說,現在您可以將切換的結果保存到變量中。

說夠了。現在讓我們看看新開關的樣子:


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

首先引起您注意的是代碼的緊湊程度。過去佔據大部分屏幕的代碼現在只需幾行,看起來更易讀。

-> 運營商

您還應該注意->運算符(箭頭運算符)。如果您有使用 lambda 表達式的經驗,您可能已經熟悉它。

這意味著現在您可以用 lambda 語句的樣式編寫一個看起來很酷的開關。箭頭運算符表示編譯器不會繼續執行下一個case表達式(如果當前case塊缺少breakreturn語句),而是會為您提供箭頭右側的表達式的值。

您還可以編寫不是表達式的代碼,只執行某些操作而不返回任何內容:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

請注意,switch不再有break語句。它在 Java 13 中被刪除並替換為yield

什麼是 yield 以及它可以用在什麼地方?

開關由單行組成時,->運算符本身會返回值。但是,如果我們沒有一行代碼,而是多行代碼怎麼辦?在這種情況下,箭頭運算符不會返回值,因為有多行,而不是一行。

也許我們可以使用return?畢竟,它是用來在 Java 中返回值的。las,不,return不能與 switch 一起使用。那我們可以用什麼呢?以前有break,但在 Java 13 中被刪除了。但是現在我們有了yield取而代之——一個新的關鍵字,可以幫助您從開關返回一個值。它類似於方法中的return語句。


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

此代碼包含一行,->運算符將返回“greeting”。

但是當我們有一段代碼時:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

幫助您返回值的關鍵字是yield


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

yield是在 Java 13 中添加的,用於處理 case 塊中有多行代碼並且需要返回結果的情況。

您可能急於在代碼中嘗試新的開關,但請記住,您需要 Java 14 或更高版本才能執行此操作。對於早期版本,只有在命令行上指定“--enable-preview”標誌時此開關才可用,因為在版本 14 之前它是技術預覽的一部分,而不是語言的完整部分。

目前為止就這樣了!再見!