當編寫帶有很多條件的代碼時,您肯定使用過if-else或switch語句。但是這種替代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塊缺少break或return語句),而是會為您提供箭頭右側的表達式的值。
您還可以編寫不是表達式的代碼,只執行某些操作而不返回任何內容:
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 之前它是技術預覽的一部分,而不是語言的完整部分。
目前為止就這樣了!再見!
GO TO FULL VERSION