[英]Switch expression with help of arrow (->), and now can yield/return the value
Java 14 中擴展的 switch 表達式,除了程序員/審閱者的視覺清晰度之外,switch 表達式的需求是不清楚的。 是嗎
參考: https : //www.techgeeknext.com/java/java14-features
JDK 14 版本:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
JDK 14 字節代碼
0: iconst_1
1: istore_1
2: iload_1
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 49
5: 54
6: 54
7: 59
default: 64
}
44: bipush 6
46: goto 65
49: bipush 7
51: goto 65
54: bipush 8
56: goto 65
59: bipush 9
61: goto 65
64: iconst_0
65: istore_2
66: return
JDK - 10 代碼
int numLetters;
int day = 1;
switch (day) {
case 1:
case 2:
case 3:
numLetters = 6;
break;
case 4:
numLetters = 7;
break;
case 5:
case 6:
numLetters = 8;
break;
case 7:
numLetters = 9;
break;
default:
numLetters = 0;
}
JDK - 10 字節代碼
0: iconst_1
1: istore_2
2: iload_2
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 50
5: 56
6: 56
7: 62
default: 68
}
44: bipush 6
46: istore_1
47: goto 70
50: bipush 7
52: istore_1
53: goto 70
56: bipush 8
58: istore_1
59: goto 70
62: bipush 9
64: istore_1
65: goto 70
68: iconst_0
69: istore_1
70: return
除了塊內的局部賦值減少了 JIT 指令之外,原語沒有重大區別。
就像switch
String
,字節碼沒有改變,也沒有必要。
雖然字節碼是專門為作為編譯 Java 源代碼的目標而設計的,但它並沒有以同樣的方式受到限制。 另請參閱Java 語言中不可用的字節碼功能……
switch
表達式利用了一個以前不被普通 Java 代碼使用但肯定被自動代碼生成器或編譯器用於其他面向 JVM 的編程語言的特性,在 switch 案例的不同分支中將值推送到操作數堆棧的可能性,以在合並點之后使用。 對於舊的switch
語句,您總是必須將值存儲到局部變量中並在合並點之后加載它。
〈另一個未被普通 Java 代碼利用但與 Java 字節碼兼容的特性是(ab)使用 switch 指令來產生花哨的循環,只需在 switch 指令之前設置目標位置。 誰知道某些源代碼功能是否會在未來的語言版本中利用它……>
但是是否使用中間局部變量,應該無關緊要。 優化器將代碼轉換為SSA 形式后,即使在其他代碼轉換和優化應用之前,本地變量和操作數堆棧之間的所有傳輸都已消除。
這並不排除由特定實現(版本)中的 switch 指令的細微變化引起的令人驚訝的性能差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.