語法糖(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