JAVA字符謎題7:嗯

字號:

下面的是一個合法的Java程序嗎?如果是,它會打印出什么呢?
    \u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
    \u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
    \u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
    \u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
    \u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
    \u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
    \u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
    \u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
    \u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
    \u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
    \u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d
     這當(dāng)然是一個合法的Java程序!這不是很顯而易見嗎?它會打印Hello World。噢,可能是不那么明顯。事實上,該程序根本讓人無法理解。每當(dāng)你沒必要地使用了一個Unicode轉(zhuǎn)義字符時,都會使你的程序的可理解性更缺失一點,而該程序?qū)⑦@種做法發(fā)揮到了極致。如果你很好奇,可以看看下面給出的該程序在Unicode轉(zhuǎn)義字符都被轉(zhuǎn)換為它們所表示的字符之后的樣子:
    public
    class Ugly
    {public
    static
    void main(
    String[]
    args){
    System.out
    .println(
    “Hello w”+
    “orld”);}}
    下面給出了將其進行格式化整理之后的樣子:
    public class Ugly {
     public static void main(String[] args){
     System.out.println("Hello w"+"orld");
     }
    }
     這個謎題的教訓(xùn)是:僅僅是因為你可以不以應(yīng)有的方式去進行表達。或者說,如果你這么做會造成損害,那么就請不要這么做!更嚴肅地講,這個謎題是對前面三個教訓(xùn)的補充:Unicode轉(zhuǎn)義字符只有在你要向程序中插入用其他任何方式都無法表示的字符時才是必需的,除此之外的任何情況都不應(yīng)該避免使用它們。Unicode轉(zhuǎn)義字符降低了程序的清晰度,并且增加了產(chǎn)生bug的可能性。
    對語言的設(shè)計者來說,也許使用Unicode轉(zhuǎn)義字符來表示ASCII字符應(yīng)該被定義為是非法的。這樣就可以使得在字符謎題4、5和7(本謎題)中的程序非法,從而消除了大量的混亂。這個限制對程序員并不會造成任何困難。