语法糖就是方便程序员使用但是对语言的功能没有影响的语法。Java语言提供很多的语法糖。学习和了解这些语法糖。有利于我们编写更好的代码以及对代码有更深的理解。

常见语法糖

到目前为止Java已经提供了10多种语法糖,下面这些语法糖是在我们日常开发中常见的

泛型与类型擦除

泛型与类型擦除是JDK1.5之后引入的最有名的语法糖。

1
2
3
4
5
List<String> nameList = new ArrayList<>();
nameList.add("gcl");
nameList.add("hpx");

以上的代码被编译成字节码之后的代码如下:

1
2
3
4
5
List nameList = new ArrayList();
nameList.add("gcl");
nameList.add("hpx");

可见在经过编译之后泛型类型就被擦除了。这也就是为什么不能使用泛型来作为重载参数。

枚举和字符串的switch

对字符串的枚举是在Java7中引入的。在JDK1.7之前的版本中并不支持此语法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String name = "gcl";
switch (name) {
case "gcl":{
System.out.println("good !!!");
break;
}
case "hpx":{
System.out.println("haha ");
break;
}
}

try-with-resource定义关闭资源

我前面专门写过一遍文章 [使用try-with-resource改进代码异常处理机制][http://guochenglai.com/2016/06/01/try-with-resource/]专门介绍了如何使用这个语法糖。来解决解决资源关闭的问题。有兴趣的可以看看。下面只列出这种语法的写法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void testExecuteQueryNew() {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
LOGGER.error("can not find driver class",e);
return;
}
try (Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD); PreparedStatement preparedStatement = connection.prepareStatement(SQL); ResultSet resultSet = preparedStatement.executeQuery();) {
if (resultSet.next()) {
System.out.println(resultSet.getObject(1)+" : "+resultSet.getObject(2));
}
} catch (Exception e) {
e.printStackTrace();
}
}

自动装箱和拆箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Integer i = 1;
int j = i + 2;
```
### for-each遍历
```java
List<String> nameList = new ArrayList<>();
for (String name : nameList) {
System.out.println(name);
}
```
### 变长参数
```java
public int calculateSum(Integer... integers) {
int sum = 0;
for (Integer tmp : integers) {
sum += tmp;
}
return sum;
}

枚举类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public enum StateEnum {
VALID(1,"状态有效"),INVALID(0,"状态无效"), DELETE(2, "被删除");
private final int code;
private final String memo;
StateEnum(int code, String memo) {
this.code = code;
this.memo = memo;
}
public int getCode() {
return code;
}
public String getMemo() {
return memo;
}
}