jdk8——你可能错过的java7特性

java7发布时,大多数开发人员都关注与新的语言特性,有一些被更改了的API不多被人发现,但在咱们的平常工做中却使用比较频繁。java

一、异常处理改进 安全

a、try-with-resource语句框架

java7提供了一个简单、实用的代码格式以下:测试

打开一个资源ui

try{spa

使用该资源日志

}finally{对象

关闭该资源接口

}资源

其中资源所属的类必须实现了AutoCloseable接口。该接口只有一个方法:

void close() throws Exception

改进后的处理方式能够写成以下的形式:

try(Resource res = ...){

使用res

}

当try语句块退出时,会自动调用res.close()方法。try-with-resource语句本身也能够含有cath和finally分支。它们都会在关闭资源后执行。在实践中,不建议在单个try语句中放置太多的逻辑代码。

b、忽略异常

不管什么时候使用输入或者输出,在产生异常后如何关闭资源都是一个麻烦的问题。假设产生了一个IOException,接下来在关闭资源时,close方法又抛出了另外一个异常。那么实际上会捕获哪一个异常呢?在java中,finally分支中抛出的异常会丢弃到以前的异常。这不只听上去不合理,实际上也确实不太合理。毕竟,用户对原始的异常会更感兴趣。

try-with-resource语句修改了这个行为。当AutoCloseable对象的close方法抛出异常时,原来的异常会被从新抛出,而调用close方法产生的异常会被捕获,并被标注为“被忽略”的异常。

c、捕获多个异常

在javase7中,你能够在同一个catch分支中捕获多个异常类型。捕获多个异常不只能让你的代码看起来更简洁,并且效率也更高。生成的字节码会包含一个含有共享catch分支的代码块。

当捕获多个异常时,异常变量会被隐式设置为final类型。

二、实现equals、hashCode和compareTo方法

a、安全的null值相等测试

在java7以后,提供了Objects。equals(a,b)方法,若是a和b都是null,返回true;若是只有其中一个为null,返回false;其余状况返回a.equals(b)。从使用习惯和代码的规范性上讲,应该讲以前使用的a.equals(b)的地方更改成这种方式。

b、计算哈希码

对于null,Objects.hashCode方法会返回0。java7中引入的可变参数方法Objects.hash容许你指定任意个对象,而且它们的哈希码会被自动组合起来。

c、比较数值类型对象

当经过比较器来比较整型值时,由于容许返回任意负值或正值,因此它会试图返回两者之间相差的大小,可是实际上只须要知道符号就足够了。

在java7以后,可使用静态方法Integer.compare来实现。过去,有开发人员会用new Integer(x).compareTo(other.x)的方式,可是这会建立两个会自动装箱/拆箱的整型对象。相比之下,静态方法compare使用的是int参数。此外,Long、Short、Byte和Boolean也都提供了各自的静态方法compare。若是你须要比较两个字符型值(char),能够直接将它们相减,结果不会溢出。Double和Float中的静态方法compare从java1.2开始就存在了。

三、其余改动

a、将字符串转换为数字

在jdk7以前,下面的代码的结果是什么

double x = Double.parseDouble("+1.0");

若是你知道结果,应该给本身一点奖励:+1.0一直都表示一个有效的浮点数,可是在java7以前,+1一直不是一个有效的整数。这个问题已经在全部经过字符串来构造int、long、short、byte和BigInteger的方法中被修复了。

b、全局Logger

为了鼓励在一些简单的程序中使用日志框架,Logger类如今提供了一个全局的Logger实例。由于它为了尽量的简化使用,因此你能够在任什么时候候都使用Logger.global.finest("x=" + x);来代替System.out.println("x" + x);。

java7中提供了一直更简单的形式——Logger.getGlobal()。

c、Null检查

Objects类提供了requireNonNull方法以便于检查参数是否为null。