1. 程式人生 > >謎題19:漂亮的火花

謎題19:漂亮的火花

pri 註釋代碼 work 自動化 main 還要 system 語句 int

下面的程序用一個方法對字符進行了分類。這個程序會打印出什麽呢?


public class Classifier {

    public static void main(String[] args) {

        System.out.println(

             classify(‘n’) + classify(‘+’) + classify(‘2’));

    }

    static String classify(char ch) {

        if ("0123456789".indexOf(ch) >= 0)

             return "NUMERAL ";

        if ("abcdefghijklmnopqrstuvwxyz".indexOf(ch) >= 0)

             return "LETTER ";

        /* (Operators not supported yet)

            if ("+-*/&|!=" >= 0)

                 return "OPERATOR ";

        */

        return "UNKNOWN";

    }

}

如果你猜想該程序將打印LETTER UNKNOWN NUMERAL,那麽你就掉進陷阱裏面了。這個程序連編譯都通不過。讓我們再看一看相關的部分,這一次我們用粗體字突出註釋部分:


if ("abcdefghijklmnopqrstuvwxyz".indexOf(ch) >= 0)

             return "LETTER ";

        /* (Operators not supported yet)

        if ("+-*/&|!=" >= 0)

                 return "OPERATOR ";

        */

        return "UNKNOWN";

    }

}

正如你之所見,註釋在包含了字符*/的字符串內部就結束了,結果使得程序在語法上變成非法的了。我們將程序中的一部分註釋出來的嘗試之所以失敗了,是因為字符串字面常量在註釋中沒有被特殊處理。

更一般地講,註釋內部的文本沒有以任何方式進行特殊處理[JLS 3.7]。因此,塊註釋不能嵌套。請考慮下面的代碼段:


/* Add the numbers from 1 to n */

int sum = 0;

for (int i = 1; I <= n; i++)

sum += i;

現在假設我們要將該代碼段註釋成為一個塊註釋,我們再次用粗體字突出整個註釋:


/*

/* Add the numbers from 1 to n */

int sum = 0;

for (int i = 1; I <= n; i++)

sum += i;

*/

正如你之所見,我們沒有能夠將最初的代碼段註釋掉。好在所產生的代碼包含了一個語法錯誤,因此編譯器將會告訴我們代碼存在著問題。

你可能偶爾看到過這樣的代碼段,它被一個布爾表達式為常量false的if語句禁用了:


//code commented out with an if statement - doesn‘t always work!

if (false) {

     /* Add the numbers from 1 to n */

     int sum = 0;

     for (int i = 1; i <= n; i++)

            sum += i;

}

語言規範建議將這種方式作為一種條件編譯技術[JLS 14.21],但是它不適合用來註釋代碼。除非要被禁用的代碼是一個合法的語句序列,否則就不要使用這項技術。

註釋掉一個代碼段的最好的方式是使用單行的註釋序列。大多數IDE工具都可以自動化這個過程:


//code commented out with an if statement - doesn’t always work!

//     /* Add the numbers from 1 to n */

//     int sum = 0;

//     for (int i = 1; i <= n; i++)

//            sum += i;

總之,塊註釋不能可靠地註釋掉代碼段,應該用單行的註釋序列來代替。對語言設計者來說,應該註意到可嵌套的塊註釋並不是一個好主意。他們強制編譯器去解析塊註釋內部的文本,而由此引發的問題比它能夠解決的問題還要多。

謎題19:漂亮的火花