語法糖(Syntactic sugar)


語法糖(Syntactic sugar),是由Peter J. Landin(和圖靈一樣的天才人物,是他最先發現了Lambda演算,由此而創立了函數式編程)創造的一個詞語,它意指那些沒有給計算機語言添加新功能,而只是對人類來說更“甜蜜”的語法。語法糖往往給程序員提供了更實用的編碼方式,有益於更好的編碼風格,更易讀。不過其並沒有給語言添加什么新東西。

 

也稱糖衣語法,指在計算機語言中添加的某種語法,這種語法對語言的功能沒有影響,但是更方便程序員使用。通常來說,使用語法糖能夠增加程序的可讀性,減少程序代碼出錯的機會。

 語法糖方便了程序員的開發,提高了開發效率,提升了語法的嚴謹也減少了編碼出錯誤的幾率。我們不僅僅在平時的編碼中依賴語法糖,更要看清語法糖背后程序代碼的真實結構,這樣才能更好的利用它們。

 

我想語法糖和其他編程思想一樣重要,什么duck type,人本接口,最小接口,約定優於配置,其實不都是一些思想上的“語法糖“?

 

不過也並不是沒有反對的聲音,這其中就有圖靈獎的第一個獲得者: Alan Perlis。.net從2.0到3.0到3.5底層CLR並沒有做更新,沒有添加任何新的IL指令,所以C#從2.0到3.0中所有的特性都是語法糖,就算從1.0到2.0,也只有一個泛型不是語法糖,其余的新特性也都是如此,但是每一次C#發布新特性的時候我們不得不為之而鼓舞,為之而喝彩。新的語法可以釀造更好的編程風格,以前一些難以實現的方面現在也輕而易舉了。
需要聲明的是“語法糖”這個詞絕非貶義詞,它可以給我帶來方便,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。

http://baike.haosou.com/doc/1355052.html

8.斷言語句//運行時需要加上 VM參數 -ea public static void main(String[] args) {

String str = "fans2";

boolean flag = "fans".equals(str);

assert (flag);

}//程序結果Exception in thread "main" java.lang.AssertionError

at JavaTenSugar.main(JavaTenSugar.java:102)

9.對枚舉的switch支持 // 對枚舉和字符串的switch支持

package switch_;

public class SwitchSelector {

    public static void main(String[] args) {
        char str='c';
        switch (str) {
        case 'c':
            System.out.println(str);
            break;

        default:
            break;
        }
    }

}

 

http://blog.sina.com.cn/s/blog_a34e3f14010140l5.html

循環歷遍(foreach)

List<Integer> list = new ArrayList<Integer>();
for(Integer num : list){
    System.out.println(num);
}

Foreach要求被歷遍的對象要實現Iterable接口,由此可想而知,foreach迭代也是調用底層的迭代器實現的。反編譯上面源碼的字節碼:

List list = new ArrayList();
Integer num;
Integer num;
for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(num)){
    num = (Integer) iterator.next();
}

枚舉
       枚舉類型其實並不復雜,在JVM字節碼文件結構中,並沒有“枚舉”這個類型。
       其實源程序的枚舉類型,會在編譯期被編譯成一個普通了類。利用繼承和反射,這是完全可以做到的。
       看下面一個枚舉類:

public enum EnumTest {
    OLIVER,LEE;
}

反編譯字節碼后:

public final class EnumTest extends Enum {

    private EnumTest(String s, int i) {
        super(s, i);
    }

    public static EnumTest[] values() {
        EnumTest aenumtest[];
        int i;
        EnumTest aenumtest1[];
        System.arraycopy(aenumtest = ENUM$VALUES, 0,
                aenumtest1 = new EnumTest[i = aenumtest.length], 0, i);
        return aenumtest1;
    }

    public static EnumTest valueOf(String s) {
        return (EnumTest) Enum.valueOf(EnumTest, s);
    }

    public static final EnumTest OLIVER;
    public static final EnumTest LEE;
    private static final EnumTest ENUM$VALUES[];

    static {
        OLIVER = new EnumTest("OLIVER", 0);
        LEE = new EnumTest("LEE", 1);
        ENUM$VALUES = (new EnumTest[] { OLIVER, LEE });
    }
}

http://blog.csdn.net/ol_beta/article/details/6787234

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM