站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE 5.0的三个新特性

J2SE 5.0的三个新特性

摘要: J2SE 5.0的三个新特性
这里介绍J2SE 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型.

J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步.

J2SE 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱(autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架构(Thread framework).

一. 枚举类型

J2SE 5.0 以及之前的JDK有两种基本方法可以来定义新类型:通过Classes 以及Interface. 对于大部分面向对象编程来说,

这两种方法看起来似乎足够了.但是在一些特殊情况下,这些方法就不适合.例如,我们想定义一个类型 Priority, 它只能接

受 High, Medium, Low 三种值. 其他任何值都是非法的.J2SE 5.0 以前的JDK是可以构造这种类型的,但是需要做很多工作,

有可能会带来如不安全(类型安全性问题???)等潜在问题,而J2SE 5.0的枚举类型(Enum) 能避免这些问题.

public enum Priority {High, Medium, Low };

它包括一个关键字enum ,一个新枚举类型的名字 Priority 以及为Priority定义的一组值.

二. 注释类型

J2SE 5.0提供了很多新的特性。其中的一个很重要的特性,就是对元数据(Metadata)的支持。在J2SE5.0中,这种元数据叫作

注释(Annotation)。通过使用注释, 程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。代码分析

工具,开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。举个例子,比如说你希望某个方法的参数或者返回

值不为空,虽然我们可以在Java doc中说明,但是表达同样意思的说法有很多,比如"The return value should not be

null"或者"null is not allowed here"。测试工具很难根据这些语言来分析出程序员所期望的前提条件(Pre-condition)和执

行后的条件(Post-condition)。 而使用注释(Annotation),这个问题就可以轻而易举的解决了。

J2SE5.0支持用户自己定义注释。定义注释很简单,注释是由@Interface关键字来声明的。比如下面是一个最简单的注

释(Annotation)。

public @interface TODO{}

标记注释的用法

@MarkerAnnotation
@SingleValueAnnotation("some value")
@MultipleValueAnnotation(
key1=value1,
key2=value2,
key3=value3,
)

在程序中不仅可以使用自己定义的注释,还可以使用J2SE5.0中内建的注释类型。J2SE 5.0中预定义了三种注释注释类型:

Override :java.lang.Override 表示当前的方法重写了父类的某个方法,如果父类的对应的方法并不存在,将会发生编译错

误。

Deprecated:java.lang.Deprecated 表示 并不鼓励使用当前的方法或者域变量。

SuppressWarnings: java.lang.SuppressWarnings关闭编译器告警,这样,在编译1.5之前的代码的时候,不会出现大量不关

心的无关的告警。

值得注意的是,J2SE5.0还提供了四种用于注释的注释类型。有以下的四种:

1. Target:用来指定这个注释(Annotation)是为哪种类型而定义的。比如,这个类型可能只是为method定义的。比

如override,不能用@override来修饰class或者field。

2.Retention:Retention的策略可以从以下三种中选取:

RetentionPolicy.SOURCE:编译器编译之后会会从class file中除去注释(Annotation)。
Retention.CLASS:注释(Annotation)保留在class file中,但是VM不会处理。
RetentionPolicy.RUNTIME,:注释(Annotation)保留在class file,VM会进行处理。
请注意,如果你希望在运行时查找到这些注释在什么地方被用到,一定要在定义注释的时候,选择RetentionPolicy.RUNTIME,

否则即使你用注释修饰了类变量或者方法,在运行时也没有办法获得这个信息的。

3.Documented:这个注释(Annotation)将作为public API的一部分。

4.Inherited : 假设注释(Annotation)定义的时候使用了Inherited,那么如果这个注释(Annotation)修饰某个class,这

个类的子类也被这个注释(Annotation)所修饰。

小结
所谓元数据,指的是关于信息的信息。一般而言,代码分析工具,测试工具或者部署工具会使用元数据来产生配置信息以及使

用配置信息产生控制逻辑。这些工具通常使用Java的反射特性,重构元数据的信息,并对这些信息进行解释。

新的技术会不断改变程序设计和开发人员的设计思想。那么注释(Annotation)给我们带来了什么呢? 仅仅在代码分析,或者

是开发测试框架和部署框架的时候才有用么? 在我们的应用中充分的利用元数据,可以提高的软件的质量和可维护性。


三. 范型

J2SE 5.0中的最显著的变化之一是添加对泛型类型的支持. 在J2SE 1.4 以及之前的版本中, Java程序并不是类型安全的. 例

如, Collection framework中定义的List, Map等容器类的元素都是Object类型, 即这个类包含的元素是Object对象. 使用这

种方式实现的列表, 可以用来操作整数, 实数, 字符串或者任何对象类型. 例如

List stringList = new ArrayList();
stringList.add("abcde");
String str = (String)stringList.get(0);


这种方法实现的列表需要使用强制类型转换(又称显示造型), 因此不是类型安全的. 在上面这段代码种, 虽然变量名

为stringList, 但是我们仍然可以把一个整型对象添加到这个队列中, 例如,

stringList.add(new Integer(5));

在这种情况下, 从字符列表中获取对象时, 强制类型转换就会导致运行时异常.

范型是Java迈向类型安全的一个重要步骤, 使用范型可以构造出类型安全的代码.

所谓范型是指类型参数化(parameterized types). Java是一种强类型的语言, 在J2SE 1.4以及以前的版本中, 我们在定义一

个Java类, 接口或者方法的时候, 必须指定变量的类型. 在声明范型类、接口或者函数时, 定义变量的时候不指定某些变量的

具体类型, 而是用一个类型参数代替. 在使用这个类, 接口, 或者方法的时候, 这个类型参数由一个具体类型所代替.


下面的例子中介绍了如何创建一个最简单范型类

public class GenSample {}

类名后面带有表明了这个类是范型类, 其中T被成为类型参数(type parameter), 在使用范型的时候, 类型参数可以被替换

为任何的类类型, 但是不能是原始类型(primitive type), 例如int, double.
下面通过一个列表的例子来具体说明如果声明范型类和类型参数的用法.


public class GenList {
private T[] elements;
private int size = 0;
private int length = 0;

public GenList(int size) {
elements = (T[])new Object[size];
this.size = size;
}

public T get(int i) {
if (i < length) {
return elements[i];
}
return null;
}

public void add(T e) {
if (length < size - 1)
elements[length++] = e;
}
}



在列表的例子中, 类型参数T被用来表示列表中的元素的类型, 即, 这个列表中的元素是T类型的.

在使用这个列表时, 这个类型参数T会被具体的类型所替代.

注意, 由于T时类型参数不是具体的类, 所以不能使用new操作符创建T的对象,例如new T(), 或者, new T[10].

在J2SE 5.0中, 不仅仅可以声明范型类, 也可以声明范型接口, 声明范型接口和声明范型类的语法类似, 也是在接口命称后面

加上. 例如,

public interface GenInterface {
void func(T t);
}

在声明范型类的时候, 可是使用多个类型参数. 多个类型参数之间用逗号分开, 例如,

public class GenMap {}

范型是J2SE 5.0所提供的一项强大的功能, 使用范型可以创建类型安全的、可重用的代码, 虽然目前Java的范型还无法和C++的范型相提并论, 但是, 随着Java语言本事的演进, 范型会在Java语言中发挥更大的作用的.




↑返回目录
前一篇: 多线程(2):J2SE 5.0多线程增强简介
后一篇: J2SE 1.4 中assertion 功能介绍(转载)