JDK 5介绍

本文介绍了JDK 5的新特性,包括范型、for - each循环、自动装箱/拆箱、枚举、变参数、静态引入和注释等。这些特性在语言层次上为程序开发提供更清晰、简短和安全的支持,还阐述了各特性的使用场景及优势,如简化反射功能等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“JDK 5”的最大的变化是使用诸如范型,for-each循环,自动装箱/拆箱,枚举,变参数,静态引入(imports)和注释来简化开发,其在语言的层次上提供对程序开发更清晰,更简短和更安全的支持。
 
范型,for-each和自动装箱/拆箱
     范型使得你定义集合(collection)的元素类型,其胜于定义一个列表(list),(定义它的内容),像String一样。举个例子,下面的代码使用新的for-each语法来叙述出在一个集合中的TimerTasks的列表,同时注意到其缺少类型变换(casting)和非常容易理解的循环语法。
void cancellAll(Collection c)
 {
    for (TimerTask task : c)
{
        task.cancel();
    }
}
在1.4和5.0中,字节码是一样的,只不过是转换一下代码而已。常听见一些网友说为什么使用:而不使用in呢?这个问题的答案有两方面的,第一in已经是一个关键字了(举个例子在System.in),同时是不希望引入新的关键词。在JDK 5中只是引入了一个新的关键字:enum。
   自动装箱:自动地将int变换为Integer
   拆箱:自动地将Integer变换为int
   举例如下,你可以很容易地做下面的事情:
Integer i = new Integer(5);
Map map = new HashMap();
map.put("result", i+1);
    你会注意到上面的一个例子,先是将Integer类型转换为int,然后进行加法,最后又将装箱为Integer,并且将其放到Map中去。很酷,是吗?^_^
JDK 5简化了反射功能,类class更加通用(generified)了---Foo.class是类型Class。这使得在编译期能够类型安全地反射w/o转换。下面的代码返回来一个对象以及进行一些必须的变换。
Foo foo = Foo.class.newInstance();
什么时候将使用范型呢?
随时都可以使用范型,除非你运行在5.0之前的java虚拟机上面。
什么时候使用for-each循环?
   可以随时使用,因为其能够美化你的代码,并且使得更加简单地实现。虽然其为5.0中最小的新的特性,但是其是人们最喜欢的一个特性。但是在下面的情况下不能使用for-each:
l         在集合中删除元素(因为没有iterator)
l         修改一个数组或者列表的当前的slot(因为隐藏了index)
l         在多个集合或者数组中iterate
 
Enums
JDK 5在语言层次上支持枚举类型。
enum Season { WINTER, SPRING, SUMMER, FALL }
枚举是可以比较和序列化的。枚举的常量是跟普通的常量是一样的。   
变参数
有一种用任意数量的值作为参数的方法是使用数组。但是使用Varargs(变参数)能够自动完成并且隐藏了其具体的过程。James Gosling使用…语法。一般的,Varargs一般是最后一个参数。在JDK 5中,MessageFormat.format函数已经使用varargs进行重写了。
public static String format(String pattern, Object... arguments);
 
String result = MessageFormat.format("At {1,time} on {1,date}, there was {2} on planet "
+ "{0,number,integer}.", 7, new Date(),
"a disturbance in the Force");
使用Varargs使得反射更加简单
    因此你可以使用c.getMethod(“test”).invoke(c.newInstance())而不是使用c.getMethod(“test”,new Object[0]).invoke(c.newInstance(),new Object[0])).
什么时候将使用变参数啊?
1.      如果设计自己的API的时候,请保守地使用
2.      当benefit是强制的时候,不要重载varargs方法
3.      在客户端中,当API支持:反射,消息格式化,printf
静态引入
客户端常要限定类里面的静态成员(Math.PI)。为了避免这个,一些程序员将一些常量放到接口中,并且实现了它。BAD(常数接口反模式)。在JDK---java.util.jar中也是错误地用了这种模式。静态地引入能够毫无限制地访问静态成员。所有静态的属性,方法等等将在使用静态引入之后都能够获得。
import static java.lang.Math.*;
r = cos(PI * theta);
什么时候将使用静态引入?
最好少用----过度地使用会使得程序很难读。当有可能滥用继承的时候使用它
元数据
    使用额外的信息来装饰程序。注释不会影响程序的语义。但是在使用工具或者库的时候能够影响使用者态度。能够从下面来读出来,源代码,类文件等等。像@deprecated,transient等等。jdk 5.0提供了更加通用的元数据工具。
为什么使用元数据呢?
很多的API需要一些样本文件,像JAX-RPC等等
l         像很多的API需要维护的”side files”,像BeanInfo类,部署描述符
l         很多API使用有名的模式,像JUnit
元数据鼓励使用声明式编程样式---告诉计算机将做什么,现在还有怎么去做。注释类型声明跟接口声明一样。特殊的注释类型包括标记注释和单元素注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值