Java 7的Coin项

Coin包括六个新特性:switch的String、数字常量新形式、改进的异常处理、TWR、钻石语法、参数警告位置的修改。

switch的String

switch在java 7后,case语句的常量可以使用String了,至于之前版本为什么不可以,引用参考链接中出现的一句话:

James Curran succinctly says: “Switches based on integers can be optimized to very efficent code. Switches based on other data type can only be compiled to a series of if() statements. For that reason C & C++ only allow switches on integer types, since it was pointless with other types.”

所以之前虽然支持byte、char、short、int(包括它们的包装类型)或枚举类型,但实际上都是将它们转化为int进行比较(这个转化润物细无声,JVM内部这些类型都是按照int存储的)。

而Java 7中支持String的实现原理是,伪代码如下:

1
2
3
4
5
6
7
String a = 传入的字符串;
switch(a.hashCode()) {
case int值:
if (a.equals("case后的字面字符串")) {
...
}
}

如果a为null,那么在switch代码块中添加default即可。

数字常量新形式

  1. 二进制形式可以用0b开头来表示了。

  2. 输入一串数字非常长,可以用_下划线作为分隔符。

改进的异常处理

  1. 通过异常分类,把类别相近的异常放在一起处理。

例如:

1
2
3
4
5
try {
} catch (FileNotFoundException | ParseException e) {
...
}
  1. 为异常重抛提供帮助。

例如在异常往上抛出的过程中,如果中间某一层的catch使用了Exception,那么继续上抛只能用笼统的catch捕获。此时可以显式添加final关键字(不是必须):

1
2
3
4
catch (final Exception e) {
...
throw e;
}

TWR

try-with-resources是我们现在比较常用的特性之一。使用资源时,将其放在try的括号内,这样当程序离开代码块的时候资源会自动关闭。

但是要注意:为了确保资源能正确关闭,应该讲各个资源声明为独立变量。

TWR还能改善错误跟踪的能力(在之前Java版本中抛出的异常信息经常会被覆盖)。

钻石语法

《Effective Java》第二章第一条讲到过静态工厂方法的第四大优势…

钻石语法顺势简化了代码。

参数警告位置的修改

泛型数组在Java中是被禁止的。而不定数量参数是依靠数组实现的,那么程序员可能不知不觉会构造出带有泛型数组的方法:

1
2
3
public static <T> ArrayList<T> doSomething(T... args) {
...
}

之前Java版本的警告信息会在使用doSomething的地方出现,而在Java 7中挪到了定义的地方。

小结

通过本篇,旨在巩固一些Java知识,了解Coin项目的基本内容。

参考

Java程序员修炼之道

Why can’t I use switch statement on a String?