Effective Java学习(泛型)之——消除非受检警告_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Effective Java学习(泛型)之——消除非受检警告

Effective Java学习(泛型)之——消除非受检警告

 2013/9/29 15:47:53  sungang_1120  程序员俱乐部  我要评论(0)
  • 摘要:先来介绍一些术语。声明中具有一个或者多个类型参数的类或者接口,就是泛型(generic)类或者接口。例如,List就只有单个参数类型E,表示列表的元素类型。从技术角度来看,这和接口的名称应该是指现在的List<E>(“读作E的列表”),但是人们经常把它简称为List。泛型类和接口统称为泛型。用泛型编程时,会遇到许多编译器的警告:非受检强制转换化警告、非受检方法调用警告、非受检普通数组创建警告,以及非受检转换警告。当你越来越熟悉泛型之后,,遇到的警告也会越来越少
  • 标签:学习 Java 泛型

先来介绍一些术语。声明中具有一个或者多个类型参数的类或者接口,就是泛型(generic)类或者接口。例如,List就只有单个参数类型E,表示列表的元素类型。从技术角度来看,这和接口的名称应该是指现在的List<E>(“读作E的列表”),但是人们经常把它简称为List。泛型类和接口统称为泛型。

?

泛型编程时,会遇到许多编译器的警告:非受检强制转换化警告、非受检方法调用警告、非受检普通数组创建警告,以及非受检转换警告。当你越来越熟悉泛型之后,,遇到的警告也会越来越少,但是不要期待从一开始用泛型编写代码就可以正确的进行编译。

?

有许多非受检警告很容易消除,例如,假设意外编写了这样一个声明:

class="java" name="code">Set<String> set = new HashSet();

?编译器会细致的提醒你哪里出错了:

你就可以纠正过来:

Set<String> set = new HashSet<String>();

?

有些警告比较难以消除。本章节要介绍这种警告的示例。当你遇到需要进行一番思考的警告时,要坚持住,要尽可能的消除每一个非受检的警告。如果,消除了所有的警告,就可以确保代码类型是安全的,这是一件很好的事情。这意味着不会在运行期间出现ClassCaseException异常,你会更加自信自己的程序可以实现预期的功能。

?

如果无法消除警告,同时可以证明该代码类型是安全的,(只有在这种情况下)才可以使用@Supppress Warnings(“unchecked”)注解来禁止警告的显示。如果在禁止警告之前没有先证实代码类型是安全的,那就只是给你自己一种错误的安全感而已。代码在编译的时候可能没有出现任何警告,但是他在运行期间仍会抛出ClassCaseException异常。但是如果忽略(而不禁止)明知道是安全的非受检警告,那么当新出现一条真正有问题的警告时,你也不会注意到,新出现的警告就会淹没在所有的错误警告中。

?

SupppressWarnings?注解可以用任何颗粒度的级别中,从单独的局部变量声明,到整个类都可以,应该始终在尽可能小的范围中使用SupppressWarnings?注解,他通常是个变量声明,或者 非常简短的方式或者构造器。永远不要在整个类上使用这样的注解,这么做可能会掩盖了重要的警告。

?

如果你发现自己在长度不知一行的方法或者构造器中使用了这样的注解,可以将它移到一个局部的变量的声明中。虽然你必须声明一个新的局部变量,不过这么做还是值得的。例如:考虑ArrayList类当中的toArray方法:

public <T> T[] toArray(T[] a){
		if (a.length < size) {
			return (T[])Arrays.copyOf(elements, size,a.getClass());
		}
		System.arraycopy(elements, 0, a, 0, size);
		if (a.length > size) {
			a[size] = null;
		}
		return a;
	}

如果编译ArrayList,该方法就会产生一条警告

?

京SuppressWarnings注解放在return语句中是非法的,,因为他不是一个声明,你可以试着将注解放在整个方法上,但是实践中千万不要这么做,而是应该声明一个局部变量来保存返回值,并注解其声明,像下面这样:

public <T> T[] toArray(T[] a){
		if (a.length < size) {
			@SuppressWarnings("unchecked")
			T[] result = (T[])Arrays.copyOf(elements, size,a.getClass());
			return result;
		}
		System.arraycopy(elements, 0, a, 0, size);
		if (a.length > size) {
			a[size] = null;
		}
		return a;
	}

?

这个方法可以正确的编译,禁止非受检警告范围也减少到最小。

?

没当时使用monospace; font-size: 1em; line-height: 1.5;">@SuppressWarnings("unchecked")时,养成一个好的习惯,用一行注释说明此做法前提是代码类型是安全的。这样可以帮助他人理解你的代码,更重要的是,可以尽量减少其他人修改代码后导致计算不安全的概率。

?

总而言之,非受检的警告很重要,不要忽视他们的存在。每一行警告都表示可能在运行时抛出ClassCaseExecption异常。要尽最大的努力消除这些警告。如果无法消除非受检警告,同时可以证明引起警告代码的类型安全的,就可以在尽可能小的范围内,用@SuppressWarnings 注解禁止警告,要用注释把禁止该警告的原因记录下来。

?

?

?

发表评论
用户名: 匿名