JDK1.5中新的语言特征

来源:互联网 发布:全国网络教育排名 编辑:程序博客网 时间:2024/06/08 01:50

泛型(Generics)--为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast)
增强的“for”循环(Enhanced For loop)--减少迭代器(iterator)的潜在错误(error-proneness)
自动置入/自动取出(Autoboxing/unboxing)--无需在基本类型(primitive types)(例如double)和包装类型(wrapper types)(例如Double)之间人工地进行转换。
类型安全的枚举(Typesafeenums)--提供类型安全枚举模式的各项好处。
静态导入(Static import)--无需在使用其他类的静态成员变量前缀其类名.这将使得代码更为简洁。
元数据(Metadata)--使编程人员避免编写样板化代码(boiler plate code),并提供机会进行宣告式程式设计(declarative programming)。



   
让我们详细讨论每个新特性,并看一些例子。

    泛型(Generics)

    泛型是JDK1.5中一个最“酷”的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。在JDK1.4中,创建雇员名字的清单(List)需要一个集合对象,像下面的语句:

    List listOfEmployeeName = new ArrayList();

    在JDK1.5中,你将使用下面语句

    List listOfEmployeeName = new ArrayList();

    最“酷”的是,如果你试图插入非string类型的值,你将在编译时发现并且修正这类问题。没有泛型,你会发现这样一个bug,当你的客户调用后会告诉你,你所编写的程序抛出ClassCastException异常而崩溃。

    另外,当你从集合中得到一个元素时你无需进行强制转换。故原先为:

    String employeeName = ((String) listOfEmployee.get(i));

    而下面的语句将比上面的更加简单:

    String employeeName = listOfEmployee.get(i);

    不清楚对象的类型而强制转换对象是不合理的,并且更重要的是,它将在运行时失败。假使用户无意间传入一个包含string buffers类型而非string类型的集合,那结果会怎样呢。在Listing A中,客户被要求传入一个编译器无法强制的strings类型集合。Listing B中显示了同样的方法使用泛型是如何实现的。

    Listing A

    staticbooleancheckName(Collection employeeNameList, String name) {

    for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {

    String s = (String) i.next();

    if(s.equals(name)){

    return true;

    //print employee name here ......

    }

    }

    return false;

    }

 

    Listing B

    staticbooleancheckName(Collection employeeNameList, String name) {

    for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {

    if(i.next().equals(name)){

    return true;

    //print employee name here ......

    }

    }

    return false;

    }

    现在,通过方法签名可以清楚知道输入集合必须只能包含strings。如果客户试图传入一个包含string buffers的集合,程序将不会编译。同时注意,该方法不包含任何强制转换。它只需要短短一行,一旦你习惯泛型后,它也更加清晰。

    增强的For循环
    在JDK当前版本下的For循环语法如下:

    void printAll(Collection c) {
    for (Iteratori = c.iterator(); i.hasNext(); ) {
    Employee emp = (Employee)i.next();
    System.out.println(emp.getName());
    }
    }

    现在,用增强的For语句实现相同方法:

    voidprintAll(Collection c) {
    for (Object o : c)
    System.out.println((TimerTask)o).getName());
    }

    在这类For循环中,你应该将":"看成"in",所以,在该例中可以看成"for Object o in c"。你可以发现这种For循环更具可读性。

    自动置入/自动取出(Autoboxing/unboxing)

    Java有基本数据类型,在这些基本数据类型周围又有包装类。通常,编程人员需要将一种类型转换成另一种。看看Listing C.中的代码片断。

    Listing C

    public class Employee {

    private static final Integer CHILD = new Integer(0);

    public static void main(String args[]) {

    //code for adding n to an Integer

    int n=10;

    Integer age= new Integer(30);

    Integer ageAfterTenYear= new Integer(age.intValue +10);

    }

    }

    请注意,用于计算ageAfterTenYear的内循环代码看上去是多么杂乱。现在,在Listing D.中看看相同的程序使用autoboxing重写后的样子。

    Listing D

    public class Employee {

    public static void main(String args[]) {

    int n=10;

    Integer age= new Integer(30);

    Integer ageAfterTenYear= age +10;

    }

    }

    有一件事值得注意的:在先前,如果你取出(unbox)Null值,它将变为0。在次代码中,编译器将自动地转换Integer为int然后加上10,接着将其转换回Integer.。


    类型安全的枚举(Typesafeenums)

    类型安全枚举提供下列特性:

    他们提供编译时类型安全。

    他们都是对象,因此你不需要将他们放入集合中。

    他们作为一种类的实现,因此你可以添加一些方法。

    他们为枚举类型提供了合适的命名空间。

    他们打印的值具有情报性(informative)— 如果你打印一个整数枚举(intenum),你只是看见一个数字,它可能并不具有情报性。

    例一:

    enum Season { winter, spring, summer, fall }

 

    例二:

    public enum Coin {
    penny(1), nickel(5), dime(10), quarter(25);

    Coin(int value) { this.value = value; }

    private final int value;

    public int value() { return value; }
    }

    静态导入(Static import)

    静态导入使代码更易读。通常,你要使用定义在另一个类中的常量(constants),像这样:

    importorg.yyy.pkg.Increment;

    class Employee {
    public Double calculateSalary(Double salary{
    return salary + Increment.INCREMENT * salary;
    }
    } 

    当时使用静态导入,我们无需为常量名前缀类名就能使用这些常量,像这样:

    import static org.yyy.pkg.Increment;

    class Employee {
    public Double calculateSalary(Double salary{
    return salary + INCREMENT * salary;
    }
    }

    注意,我们可以调用INCREMENT这一常量而不要使用类名Increment.。

    元数据(Metadata)
元数据特征志于使开发者们借助厂商提供的工具可以进行更简易的开发。看一看Listing E.中的代码。


    Listing E

    importorg.yyy.hr;

    public interface EmployeeI extends Java.rmi.Remote {

    public String getName()

    throwsJava.rmi.RemoteException;

    public String getLocation ()

    throwsJava.rmi.RemoteException;

    }

    public class EmployeeImpl implements EmployeeI {

    public String getName(){

 

    }

    public String getLocation (){

 

    }

    }

    通过元数据的支持,你可以改写Listing E中的代码为:

    importorg.yyy.hr;

    public class Employee {
    @Remote public String getName() {
    ...
    }
    @Remote public public String getLocation() {
    ...
    }
    }

    正像你所看到的,所有样板化的代码都不见了。

    这些新特性和规格说明将在JDK1.5中实现。它将提供Java编程社区更多的选择以编写鲁棒的、可扩展的代码。认真的Java编程人员将感到着手去熟悉这一Java编程语言的新版本是很有益的。


引用自: http://blog.yesky.com/blog/mpopol/archive/2006/02/16/1216984.html

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高德导航时Navi的信息 高德NaviInfo 安卓蓝牙发送信息 clj.fastble 先采用队列求一条最短迷宫路径长度minlen,再采用栈求所有长度为minlen的最短迷宫路径 iOS蓝牙 pycharm激活 shadowsocks下载 shadowsocks下载 开源沙龙 C++程序设计从键盘中输入两个整数,求这两个整数的最大公约数和最小公倍数。 江南大学五部曲 centos搭建ss 算法之美_源代码发布(8) understand halfaSPIclockcycleproducesaclockedge 贪心算法活动 TRIZ系列-创新原理-17 朴素贝叶斯分类 王者荣耀金币 探索性数据分析演示 治安防控 治安 TRIZ系列-创新原理-19 TRIZ系列-创新原理-20 利用图像的平移、旋转、缩放、镜像等空间几何变换实现对图像的自适应缩放、几何变换等特效 利用图像的平移、旋转、缩放、镜像等空间几何变换实现对图像的几何变换等特效 [Err]1005-Can\'tcreatetable\'item4.#sql-1238_2c\'( SAPFICO财务成本知识 财务管理分析(希金斯:第八版) 图像解压 巜人民曰报》采访张文宏,陈尔真 linux上服务器如何转发设置 图像的自适应缩放、几何变换等特效 千讯网络下载 Gsensor调试 MTKGsensor调试 展讯Gsensor调试 webrtcaec webrtc http://download.csdn.net/detail/aa1000777/7251959