Java 程序经验小结:剖析 @SuppressWarinings 注解
1、写在开头
使用泛型编程时,会遇到许多编译器警告,例如:非受检强制转换警告(unchecked east warning)、非受检方法调用警告、非受检普通数组创建警告、非受检转换警告(unchecked conversion warnings)。
2、消除受检警告:修改代码
容易消除的受检警告,举个例子:下面创建一个 HashSet 对象,但是在声明中没有标志泛型的类型,因此编译器会提醒我们此处缺少泛型的声明。
idea 工具提醒:
我们可以通过修改代码以消除提示的警告:
不容易消除的受检警告,往往值得是那些需要进行一番思考,比如:业务中抽象出来的代码块或方法,它们已经早已定型并被广泛使用了。那么我们可以用一个 @SuppressWarnings("unchecked") 注解来禁止这条警告。
注意如果不能证实代码是类型安全的,那就只是一个错误的安全感,在编译时虽然可以过关,但运行时仍然可能抛出 ClassCastException 异常。
3、使用 SuppressWarnings 注解
SuppressWarnings 注解可以用在任何粒度的级别中(从局部变量到整个类都可以),但我们要坚持一个使用原则:始终在尽可能小的范围中使用 SuppressWarnings 注解,且不要在整个类上使用 SuppressWarnings 注解(会掩盖所有重要的警告)。
下面我们举个例子演示 @SuppressWarnings 的使用:ArrayList 类的 toArray(T[] a) 方法。先看源码:
我们如果编译 ArrayList,上面得到方法会产生一个警告:
SuppressWarnings 注解放在 returen 语句时非法的,因为它不是一个生命,最好方法是声明一个局部变量来保存返回值,然后再将 SuppressWarnings 注解“打在”这个局部变量的声明,同时最好要有一条注释来说明为什么是安全的。
于是我们有了以下的改正:
4、总结
总结一下,非受检警告非常重要,开发者一般不要忽略它们。每一条警告都表示可能在运行时抛出 ClassCastException 异常,尽量做到:
尽最大努力消除受检警告
即使不能完全消除,也要尽可能证明引起警告的代码是类型安全的,并可以在尽可能小的范围中,使用 @SuppressWarnings("unchecked") 注解禁止警告;
同时把禁止该警告的原因记录下。
版权声明: 本文为 InfoQ 作者【后台技术汇】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f2ca99831bd7517c1ed68019】。文章转载请联系作者。
评论