-
沈阳航空工业学院毕业设计(外文翻译)
在
JDK
早期版本中使用
Java 5
的语言特性
Java
5
添加了许多强大的语言特性:
泛型
、
枚举、
注释、
自动装箱和增强的
p>
for
循环。但是,许多工作组仍然被绑定在
JDK 1.4
p>
或以前的版本上,可能需要花些时
间才能使用新版本。
但是,
这些开发人员仍然可以使用这些功能强大的语言特性,
同
时在
JVM
早期版本上部署。在这一期
Java
理论与实践
中,
Brian
Goetz
将演示如
何在
JDK
早期版本中使用
Java 5
的语言特性。
随着最新的
Java 6.0
的发布,您可能认为
Java 5
的语言特性是
“旧的新特
性”。
但是即使在现在,
当我询问开发人员在开发
时使用的
Java
平台的版本时,
通
常只有一半人在使用
Java
5
——
另一半则只能表示羡慕。他们非常希望使用
Java
5
中添加的语言特性,例如泛型和注释,但仍有许多因素妨碍
他们这样做。
不能利用
Java
5
特性的开发人员包括那些开发组件、
库或应用程序框架的开发
人员。因为他们的客户可能仍然在使用
JDK
1.4
或以前的版本,并且
JDK
1.4
或以
前的
JVM
不能装载用
Java 5
编译的类,所以使用
Java 5
语言特性会把他们的客
户基数限制在已经迁移到
Java 5
的公司。
另一类经常避免使用
Java 5
的开发人员是使用
Java EE
的开发人员。许多开
发团队不愿在
Java
EE
1.4
及以前的版本上使用
Java
5<
/p>
,因为担心其应用服务器的
厂商不支持
Java
5
。这些开发人员要迁移到
Java
EE
5
可能还有待时日。除了
Java
EE 5
和
Java SE 5
规范之间的滞后,商业
Java EE 5
容器没有必要在规范刚刚制
定好就能使用,
企业也没有
必要在应用服务器出现下一个版本时就立即升级,
而且在
升级应
用服务器之后,可能还需要花些时间在新平台上验证其应用程序。
Java 5
语言特性的实现
Java
5
中添加的语言特性
——
泛型、枚举、注释、自动装箱和增强的
for
循
环
——
不需要修改
JVM
的指令集,
p>
几乎全部是在静态编译器
(
javac
p>
)
和类库中实
现的。
当编译器遇到使用泛型的情况时,
会试图检查是否保证了类型安全
(如果不能
检查,会发出
“unchecked cast”),然后发出字节码,生成的字节码与等价的非
p>
泛型代码、类型强制转换所生成的字节码相同。类似的,自动装箱和增强的
< br> for
循
环仅仅是等价的
“语法糖”,只是更复杂的语法和枚举被编译到普通的类中。
1
沈阳航空工业学院毕业设计(外文翻译)
在理论上,
可以采用
javac
生成的类文件,
在早期的
JVM <
/p>
中装入它们,
这实际
上正是
JSR
14
(负责泛型的
Java
Community
Process
工作组)的成立目的。但是,
其他问题(例如注释的保持)迫使类文件的版本在
Java 1.4
和
Java 5
之间变化,
因此妨碍了早期
JVM
中装入用
Java 5
编译的代码。而且,在
Java 5
中添加的有
些语言特性依赖于
Java 5
库。如果用
javac -target
1.5
编译类,并试图将它装
入早期
JVM
中,就会得到
UnsupportedClassV
ersionError
,因为
-target 1.5
选
项生成的类的类文件版本是
49
,而
JDK 1.4
只支持版最大为
48
的类文件版本。
for-each
循环
增强的
for
循环有时叫做
for-each
< br>循环,编译器编译它的时候,情形与程序
员提供旧式
for
循环一样。
for-each
循环能够迭代数组或集合中的元素。
清单
1
显
示了用
for-each
在集合上迭代的语法:
清单
1. for-each
循环
Collection
for (Foo f : fooCollection) {
doSomething(f);
}
编译器把这个代码转换成等价的基于迭代器的循环,如清单
2
所示:
清单
2.
清单
1
基于迭代器的等价循环
for
(Iterator
Foo f = ();
doSomething(f);
}
编译器如何知道提供的参数有一个
iterator()
方法呢?
javac
编译器的设计
者可能已经内置了对集合框架的理解,
但是这种方法有些不必要的限制。
所以,
创建
< br>了一个新的接口
le
(请参阅清单
3
),并翻新集合类使其实现
2
沈阳航空工业学院毕业设计(外文翻译)
Iterable
接口。
这样,
p>
不是在核心集合框架上构建的容器类也能利用新的
for-
each
循环。
但是这样做会形成对
Java
5
类库的依赖,
因为在
JDK
1.4
中没有
Iterable
。
清单
3. Iterable
接口
public
interface Iterable
Iterator
}
枚举和自动装箱
正像
for-each
循环一样,
枚举也要求来自类库的支持。
当编译器遇到枚举类型
时,
生成的类将扩展库类
。
但是,
同
Iterable
一样,
在
JDK
1.4
类
库中也没有
Enum
类。
类似的,
自动装箱依赖于添加到原始包装器类
(例如
Integer
)
的
valueOf()
方
法。当装箱需要从
int
转换到
Integer
时,编译器并不调用
new Integer(int)
p>
,
而是生成对
f(int)
的调用。
valueOf()
方法的实现利用
享元
(
flyweight
)
模式
为常用的整数值缓存
Integer
对象
(
Java
6
的实现缓存从
-128
到
127
的整数)
,
由于消除了冗余的实例化,
可能会提高性能。
而且,
就像
Iterable
和
Enum
一样,
valueOf()
方法在
JDK 1.4
类库中也不存在。
变长参数
当编译器遇到用变长参数列
表定义的方法时,
会把其转换成包含正确组件类型数
组的方法;
当编译器遇到带有变长参数列表方法的调用时,就把参数装进数组。
注释
定义了注释的之后,
可以用
@Retention
对它进行注释,
它可以决定编译器对使
用这个注释的类、
方法或字段执行什么处理。
< br>已经定义的保持策略有
SOURCE
(在编
译时舍弃注释数据)、
CLASS
(在类文件中记录注释)或
RUNTIME
(在类文件中记
录注释,并在运行时保留注释,这样就可以反射地访问它们了)
。
其他的库依赖关系
3
-
-
-
-
-
-
-
-
-
上一篇:货代专用术语
下一篇:外贸术语解释大全英语词汇.doc