J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(2)

原创 2003年07月12日 10:54:00

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />您能把这六个方面的改进概括一下吗?

 

那好,我做一个简述:

  • 泛型Generic提供了collection操作的编译期类型安全,并且避免了类型转换的苦差事。

  • For循环增强Enhanced for loop避免使用容易引起错误的迭代器.

  • 自动置入/自动取出Autoboxing/unboxing避免了在基本类型(如int)和包装类型(如Integer)之间人工转换类型的苦差事。

  • 类型安全的枚举Typesafe enums提供了类型安全的枚举模式((Effective Java, Item 21))的好处,却没有冗长和易错的代码。

  • 静态导入Static import让你可以避免使用类的静态变量而必须前缀类名;而且避免了常数接口的缺点(Effective Java, Item 17)

  • 元数据让你避免写样本代码。你在程序中做标记然后工具自动帮你生成样本代码。这会导致一种声明式的程序设计方格,你说应该做什么,然后工具就会产生代码完成这个任务。

如果遵循新规范并且开始使用泛型,那么现在使用集合的方式和使用带泛型的集合有什么不同之处?

 

我们一般这样使用集合:

 

/**

 * 在由String构成的集合中删除所有长度为4的元素

 * 传入的集合必须由String构成

*/

static void expurgate(Collection c) {

    for (Iterator i = c.iterator(); i.hasNext(); ) {

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

        if(s.length() == 4)

            i.remove();

    }

}

 

这个类型转换并不完美,而且更重要的是程序可能会在运行时发生错误。假设用户不小心传入一个由StringBuffer构成的集合而不是注释中说明的String,那么就可能会有意外发生。注释说客户端必须传入一个由String构成的集合,但是并不能要求编译器编译时一定满足注释。

 

下面是同样的代码使用泛型的例子

 

/**

 *在由String构成的集合中删除所有长度为4的元素

 */

static void expurgate(Collection<String> c) {

    for (Iterator<String> i = c.iterator(); i.hasNext(); )

        if (i.next().length() == 4)

            i.remove();

}

 

现在从代码的签名就可以看出,输入参数必须是仅仅由String构成的集合。如果客户试图传入一个由StringBuffer构成的集合,程序就不会通过编译。而且请注意我们上面的代码中并没有类型转换。它只有短短的一行,而且阅读使用泛型集合的代码也会非常清晰。

 

请您给我们介绍一下 "for增强"?

 

我们可以使用更优雅的方法遍历一个集合。你一般遍历集合的时候,都只是取元素,很少用到其他的方法。"for增强"可以让编译器代替你管理你的迭代器。例如,这是一个使用迭代器遍历一个由TimeTask构成的集合:

 

void cancelAll(Collection c) {

    for (Iterator i = c.iterator(); i.hasNext(); ) {

        TimerTask tt = (TimerTask) i.next();

        tt.cancel();

    }

}

 

现在我们用"for增强"重写一下这个方法:

 

void cancelAll(Collection c) {

    for (Object o : c)

        ((TimerTask)o).close();

}

 

当你读这个语句的时候,其中的分号读作“在其中”。如果我们使用两个新关键字foreachin将会更加自然,不过引入新关键字会比较麻烦。比如如果我们现有的代码中如果正好使用这两个字作为标志符的话,那么新的编译系统就会破坏我们的原有代码。我们的方法是在保留兼容性的基础扩充语言。

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月24日 04:08
  • 198

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(4)

新的“类型安全的枚举”(typesafe enums)比用整数枚举(int enum)有什么优势? 这个问题在我的书第21项中有详细的论述。简要地说: 它提供了编译期类型安全,而整数枚举根本没有提供任...
  • liuflei3139
  • liuflei3139
  • 2003年07月12日 10:54
  • 939

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(5)(完)

看起来真的很好。您乐意跟我们介绍一下静态导入(static import)会给开发者带来什么吗?  它让程序员不必在使用类的静态成员时前缀类名。人们确实希望这样,所以他们经常实现所谓的常数接口来达到这...
  • liuflei3139
  • liuflei3139
  • 2003年07月12日 10:55
  • 844

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(3)

您能把泛型和"for增强"结合在一起吗?  当然没问题。你看,我们把泛型技术融入到上面的代码中:  void cancelAll(Collection c) {    for (TimerTask t...
  • liuflei3139
  • liuflei3139
  • 2003年07月12日 10:54
  • 879

J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(1)

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录原文http://java.sun.com/features/2003/05/bloch_qa.htmlby Janice J. H...
  • liuflei3139
  • liuflei3139
  • 2003年07月12日 10:54
  • 931

Joshua Bloch离开Google了,Dart前景堪忧

Joshua Bloch,Java界的传奇人物,如果你没有听过他的名字,也肯定看过他的书(Effective Java,Java Concurrency in Practice, Java Puzzl...
  • qinjienj
  • qinjienj
  • 2012年09月21日 22:42
  • 4417

采访Java Collection的作者Joshua Bloch

想必用Java的人都用过JDK的容器类吧,什么List, Set, Map啦。每天这些代码在全世界成千上万的JVM里面运行,每天数以万记的程序员在使用这些类。你知道这些这么cool的代码是谁写的吗?是...
  • michaellufhl
  • michaellufhl
  • 2010年09月16日 23:25
  • 2770

Java教父Joshua Bloch访谈

Sun公司网站登出了2007 JavaOne大会期间对Joshua Bloch的访谈——摇滚巨星Josh Bloch。 Bloch现任Google 首席Java架构师,而在此之前,他是Sun公司的杰出...
  • turingbook
  • turingbook
  • 2007年06月10日 22:38
  • 3933

Joshua Bloch

早在1996年,适逢Java刚刚崭露头角,年内好事连连。先是1月份发布JDK 1.0,然后是5月底在旧金山召开首届JavaOne大会,年末又是JDK 1.1紧跟其后。正是在Java技术如火如荼、大展拳...
  • zzhangxiaoyun
  • zzhangxiaoyun
  • 2013年05月28日 09:20
  • 458

Joshua Bloch

  早在1996年,适逢Java刚刚崭露头角,年内好事连连。先是1月份发布JDK 1.0,然后是5月底在旧金山召开首届JavaOne大会,年末又是JDK 1.1紧跟其后。正是在Java技术如火如荼、大...
  • yuanfen860913
  • yuanfen860913
  • 2010年07月22日 16:57
  • 545
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(2)
举报原因:
原因补充:

(最多只允许输入30个字)