iT邦幫忙

DAY 7
3

實戰 Java SE 7 系列 第 7

Project Coin - switch 語法支援字串變數 (Stings in switch) 續

既然 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 這樣的方式來表示。


上一篇
Project Coin - switch 語法支援字串變數 (Stings in switch)
下一篇
Project Coin - switch 語法支援字串變數 (Stings in switch) 完
系列文
實戰 Java SE 7 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
krarm
iT邦好手 1 級 ‧ 2011-10-19 22:46:34

開了反組譯的眼界了

我要留言

立即登入留言