`
strawren
  • 浏览: 46998 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK1.5中新的语言特征

阅读更多

本文中,我们将讨论几个在JDK1.5中新的语言特征,包括:<o:p></o:p>

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

让我们详细讨论每个新特性,并看一些例子。<o:p></o:p>

泛型(Generics<o:p></o:p>

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

List listOfEmployeeName = new ArrayList();  <o:p></o:p>

JDK1.5中,你将使用下面语句<o:p></o:p>

List<String> listOfEmployeeName = new ArrayList<String>();<o:p></o:p>

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

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

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

而下面的语句将比上面的更加简单:<o:p></o:p>

String employeeName = listOfEmployee.get(i);<o:p></o:p>

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

Listing A  <o:p></o:p>

staticbooleancheckName(Collection employeeNameList, String name) {<o:p></o:p>

  for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {<o:p></o:p>

String s = (String) i.next();<o:p></o:p>

if(s.equals(name)){<o:p></o:p>

  return true;<o:p></o:p>

//print employee name here ......<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

return false;<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

Listing B <o:p></o:p>

staticbooleancheckName(Collection<String> employeeNameList, String name) {<o:p></o:p>

for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {<o:p></o:p>

  if(i.next().equals(name)){<o:p></o:p>

  return true;<o:p></o:p>

  //print employee name here ......<o:p></o:p>

  }<o:p></o:p>

  }<o:p></o:p>

return false;<o:p></o:p>

}<o:p></o:p>

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

JDK当前版本下的For循环语法如下:<o:p></o:p>

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

  <o:p></o:p>

现在,用增强的For语句实现相同方法:<o:p></o:p>

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

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

自动置入/自动取出(Autoboxing/unboxing<o:p></o:p>

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

Listing C <o:p></o:p>

public class Employee {<o:p></o:p>

private static final Integer CHILD = new Integer(0);<o:p></o:p>

public static void main(String args[]) {<o:p></o:p>

//code for adding n to an Integer<o:p></o:p>

int n=10;<o:p></o:p>

Integer age= new Integer(30);<o:p></o:p>

Integer ageAfterTenYear= new Integer(age.intValue +10);<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

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

Listing D <o:p></o:p>

public class Employee {<o:p></o:p>

       public static void main(String args[]) {<o:p></o:p>

         int n=10;<o:p></o:p>

         Integer age= new Integer(30);<o:p></o:p>

         Integer ageAfterTenYear= age +10;<o:p></o:p>

       }<o:p></o:p>

}<o:p></o:p>

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

类型安全的枚举(Typesafeenums<o:p></o:p>

类型安全枚举提供下列特性:<o:p></o:p>

  • 他们提供编译时类型安全。 <o:p></o:p>
  • 他们都是对象,因此你不需要将他们放入集合中。 <o:p></o:p>
  • 他们作为一种类的实现,因此你可以添加一些方法。 <o:p></o:p>
  • 他们为枚举类型提供了合适的命名空间。 <o:p></o:p>
  • 他们打印的值具有情报性(informative如果你打印一个整数枚举(intenum你只是看见一个数字,它可能并不具有情报性。 <o:p></o:p>

例一:<o:p></o:p>

enum Season { winter, spring, summer, fall } <o:p></o:p>

例二:<o:p></o:p>

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; }
}
<o:p></o:p>

静态导入(Static import<o:p></o:p>

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

importorg.yyy.pkg.Increment;

class Employee {
       public Double calculateSalary(Double salary{
              return salary + Increment.INCREMENT * salary;
       }
}
<o:p></o:p>

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

import static org.yyy.pkg.Increment;

class Employee {
       public Double calculateSalary(Double salary{
               return salary + INCREMENT * salary;
       }
}
<o:p></o:p>

注意,我们可以调用INCREMENT这一常量而不要使用类名Increment.<o:p></o:p>

元数据(Metadata<o:p></o:p>

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


Listing E <o:p></o:p>

importorg.yyy.hr;<o:p></o:p>

public interface EmployeeI extends Java.rmi.Remote {<o:p></o:p>

       public String getName()<o:p></o:p>

               throwsJava.rmi.RemoteException;<o:p></o:p>

       public String getLocation ()<o:p></o:p>

               throwsJava.rmi.RemoteException;<o:p></o:p>

}<o:p></o:p>

public class EmployeeImpl implements EmployeeI {<o:p></o:p>

       public String getName(){<o:p></o:p>

  <o:p></o:p>

       }<o:p></o:p>

       public String getLocation (){<o:p></o:p>

    <o:p></o:p>

       }<o:p></o:p>

}<o:p></o:p>

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

importorg.yyy.hr;

public class Employee {
       @Remote public String getName() {
               ...
       }
       @Remote public public String getLocation() {
               ...
       }
}
<o:p></o:p>

正像你所看到的,所有样板化的代码都不见了。<o:p></o:p>

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

 
分享到:
评论

相关推荐

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    jdk1.5x64位 windows版.zip

    JDK1.5是Java的一个重要版本,它在2004年9月30日正式发布,也被称为Java 5.0。这个版本引入了大量的新特性,对Java平台进行了重大改进,提升了开发效率和性能。 首先,JDK1.5引入了类型安全的枚举(enum),这是对...

    linux系统jdk1.5下载

    Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...

    JDK1.5中新的语言特征分类介绍

    ### JDK 1.5 中新的语言特征分类介绍 #### 泛型(Generics) 泛型是Java Development Kit (JDK) 1.5 版本中最显著的新特性之一,它为开发者提供了强大的类型安全机制。在Java早期版本中,集合(如`List`或`Set`)...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    JDK1.5,JDK1.5

    JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...

    jdk 1.5 linux (共三个文件)之一

    测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin

    详细介绍JDK1.5的各种新特性

    **JDK1.5**,又称为Java Development Kit的第5个主要版本,标志着Java语言的一个重大里程碑。这个版本引入了一系列创新性特性和改进,极大地提升了开发效率和代码的可读性,为Java编程带来了全新的体验。以下是JDK...

    JDK1.5最终版全平台下载

    JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...

    jdk1.5 windows 64位官方正式版,绝对有效

    总的来说,JDK1.5对Java语言做了大量的优化和增强,使得Java更适合于现代软件开发的需求,提升了代码质量和开发效率。这个版本的JDK1.5.0.22是64位的,适用于Windows操作系统,能够充分利用64位系统的优势,提供更好...

    linux下JDK1.5

    本文将深入探讨Linux下JDK1.5的相关知识点,帮助用户更好地理解和使用这个版本的Java开发环境。 首先,安装JDK1.5在Linux系统中通常涉及以下步骤: 1. **下载**:你需要从Oracle官方网站或者第三方镜像站点下载...

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    历史版本JDK1.5安装包

    总的来说,JDK 1.5的推出极大地提高了Java编程的效率和安全性,使得Java语言在面向对象编程、类型安全性和可维护性方面迈出了重要的一步。尽管随着时间的推移,更高级别的JDK版本不断发布,但JDK 1.5在某些特定场景...

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    在"IBM_jdk1.5_Guide.pdf"这个文档中,很可能是IBM JDK 1.5的官方指南或开发者手册,它将详细阐述如何安装、配置和使用IBM JDK 1.5,以及如何在AIX环境下进行Java开发。而"www.pudn.com.txt"可能是下载资源的来源...

    jdk jdk1.5 windows系统

    以上是JDK1.5对Java语言的重要贡献,这些特性极大地提升了开发效率和代码质量。如果你在Windows系统上解压并安装了"jdk1.5.0_01",你将能够利用这些特性进行Java编程。确保在环境变量中设置好`JAVA_HOME`,并将`bin`...

Global site tag (gtag.js) - Google Analytics