語法糖(Syntactic Sugar):也稱糖衣語法,指在計算機語言中添加的某種語法,這種語法對語言的功能沒有影響,但是更方便程序員使用。通常來說,使用語法糖能夠增加程序的可讀性,減少程序代碼出錯的機會。
相對於C#及許多其他JVM來說,Java在現代編譯語言之中屬於“低糖語言”。尤其是JDK1.5之前的版本,“低糖”語法也是java語言被懷疑已經“落后”的一個表現方面。
在Javac的源碼中,解語法糖的過程由desugar()方法觸發,在com.sun.tools.javac.comp.TransTypes類和com.sun.tools.javac.comp.Lower類中完成。
Java中的語法糖包括但不限於以下10顆:泛型與類型擦除、自動裝箱和拆箱、遍歷循環、變長參數、條件編譯、內部類、枚舉類、斷言語句、對枚舉和字符串的switch支持、在try語句中定義和關閉資源。
1.泛型與類型擦除 Java中的參數化類型只在源碼中存在,在編譯后的字節碼中,已經被替換為原來的原生類型了,並且在相應的地方插入了強制轉換代碼。對於運行期的Java 語言來說,ArrayList<Integer>和ArrayList<String>就是同一個類。所以說泛型技術實際上就是 Java語言的一顆語法糖,Java語言中的泛型實現方法稱為類型擦除,基於這種方法實現的泛型稱為偽泛型。// 泛型與類型擦除
public void parameterizedType() {
List<String> list = new ArrayList<String>();
list.add("Fans.Lei");
}
2.自動裝箱和拆箱 自動裝箱和拆箱實現了基本數據類型與對象數據類型之間的隱式轉換。 // 自動裝箱和拆箱
public void autobox() {Integer one = 1;
if (one == 1) {
System.out.println(one);
}
}
3.foreach循環 foreach語句是java5的新特征之一,在遍歷數組、集合方面,foreach為開發人員提供了極大的方便。
foreach語句是for語句的特殊簡化版本,但是foreach語句並不能完全取代for語句,然而,任何的foreach語句都可以改寫為for語句版本。 foreach並不是一個關鍵字,習慣上將這種特殊的for語句格式稱之為“foreach”語句。// foreach循環
public void foreach() {
Integer[] array = { 1, 2, 3, 4, 5 };
for (Integer i : array) {
System.out.println(i);
}
}
4.變長參數 Arrays.asList(1, 2, 3, 4, 5); public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
5.條件編譯 // 條件編譯
public void ifdef() {if (true) {
System.out.println("true");
} else {//此處有警告--DeadCode
System.out.println("false");
}
}
6.內部類 public class JavaTenSugar {class Name {
String firstName;String secondName;
}}
7.枚舉類public enum SEX {
MAN, WOMAN
}}
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 sugar.JavaTenSugar.main(JavaTenSugar.java:102)
9.對枚舉和字符串的switch支持 // 對枚舉和字符串的switch支持
public void enumStringSwitch() {
String str = "fans";
switch (str) {
case "fans":
break;case "leiwen":
break;default:
break;
}
}
10.在try語句中定義和關閉資源 jdk7提供了try-with-resources,可以自動關閉相關的資源(只要該資源實現了AutoCloseable接口,jdk7為絕大部分資源對象都實現了這個接口)
staticStringreadFirstLineFromFile(Stringpath)throwsIOException{
try(BufferedReaderbr=newBufferedReader(newFileReader(path))){
returnbr.readLine();
}
}