既然 switch 語法支援字串變數,能帶給程式設計師很大的方便,為什麼不早點支援這項功能呢?
之前一直沒有支援字串的比對,我想原因之一是,字串的比較判斷沒有整數判斷來的有效率。如果你使用 jad 這類的反組譯工具,去反組譯 Day6Example2 的 class 檔:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Day6Example2.java
package idv.jacky.ironman4.day6;
import java.io.*;
public class Day6Example2
{
public Day6Example2()
{
}
public static void main(String args[])
{
BufferedReader in;
String fruit;
String color;
in = new BufferedReader(new InputStreamReader(System.in));
fruit = "";
color = "";
_L9:
System.out.print("\u8ACB\u8F38\u5165\u4E00\u7A2E\u6C34\u679C(\u860B\u679C, \u8349\u8393, \u9999\u8549, \u82AD\u6A02, \u8461\u8404) > ");
try
{
fruit = in.readLine();
}
catch(IOException e)
{
e.printStackTrace();
}
String s;
(s = fruit).hashCode();
JVM INSTR lookupswitch 5: default 193
// 1064181: 104
// 1075562: 117
// 1084355: 130
// 1090289: 143
// 1253072: 156;
goto _L1 _L2 _L3 _L4 _L5 _L6
_L1:
continue; /* Loop/switch isn't completed */
_L2:
if(s.equals("\u82AD\u6A02"))
{
color = "\u7DA0\u8272";
break; /* Loop/switch isn't completed */
}
continue; /* Loop/switch isn't completed */
_L3:
if(!s.equals("\u8349\u8393"))
continue; /* Loop/switch isn't completed */
goto _L7
_L5:
if(!s.equals("\u860B\u679C"))
continue; /* Loop/switch isn't completed */
goto _L7
_L6:
if(s.equals("\u9999\u8549"))
{
color = "\u9EC3\u8272";
break; /* Loop/switch isn't completed */
}
continue; /* Loop/switch isn't completed */
_L7:
color = "\u7D05\u8272";
break; /* Loop/switch isn't completed */
_L4:
if(!s.equals("\u8461\u8404"))
continue; /* Loop/switch isn't completed */
color = "\u7D2B\u8272";
if(!fruit.equals("") && !color.equals(""))
System.out.printf("%s \u7684\u984F\u8272\u662F %s%n", new Object[] {
fruit, color
});
fruit = "";
color = "";
if(true) goto _L9; else goto _L8
_L8:
}
}
從上面的程式碼當中,從第36行開始,就是轉換過的 switch 陳述式,一直到第73行,你可以看到,Java 最後還是將 switch 轉成原本的 if 陳述式。所以這個新功能其實法上的簡化,透過 Java 編譯器來將簡化過的陳述式,轉換成正式的陳述式。
這樣的行為,有個專有名,叫作 Compiler Sugar。固名思義,就是編譯器幫你做些苦工,讓你在撰寫程式碼時嘗些甜頭,使程式碼更方便、簡潔、易懂。
PS. 為什麼上面反組譯過的程式碼,中文的部份是 \uxxxx 的格式?那是因為 Java 所使用的字元都是 Unicode。程式在編譯時,自動將非 ASCII 的字元,轉成用 \uxxxx 這樣的方式來表示。