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

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

看起来真的很好。您乐意跟我们介绍一下静态导入(static import)会给开发者带来什么吗?

 

它让程序员不必在使用类的静态成员时前缀类名。人们确实希望这样,所以他们经常实现所谓的常数接口来达到这个效果:

 

// "Constant Interface" antipattern - do not use!

public interface Physics {

  public static final double AVOGADROS_NUMBER   = 6.02214199e23;

  public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;

  public static final double ELECTRON_MASS      = 9.10938188e-31;

}

 

public class Guacamole implements Physics {

    public static void main(String[] args) {

        double moles = ...;

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

 

这是一个非常糟糕的做法:接口是用来定义类型的,不是用来定义常量的。Guacamole 使用Physics常数仅仅是一个实现细节,不应该对外开放公共的API。这样做的结果不仅让这个类的使用者糊涂,而且它还做了长期的承诺。即使你准备重写Guacamole 这个类,其中不再用到这些常数,你依然必须implements这个接口。因为这个类的使用者依赖于你的类implements Physics这个事实。

 

静态导入(static import)提供了一个清晰的解决方案。它让程序员使用某个类的静态成员而不用成为它的子类的方法。它和package import的功能很相似,不过他只是导入一个类的静态成员,而package import则是从包中导入一个类。下面是一个例子:

 

import static org.iso.Physics.*;

 

class Guacamole {

    public static void main(String[] args) {

        double molecules = AVOGADROS_NUMBER * moles;

        ...

    }

}

 

注意,无论Physics是一个接口还是一个类,这个程序都可以正常地工作。如果它只是定义常数,那么它就应该定义为一个类而不是一个接口。

 

我懂了。现在您能告诉我关于元数据(metadata)的一些便利吗?

 

这与我们讨论的其它的一些特性不太相同。它同样也可以让开发变得更容易,不过需要工具开发商的支持。

 

现在许多API需要相当数量的样板文件。比如,当你定义一个JAX-RPC Web Service的时候 ,你要提供一个接口和一个实现类:

 

public interface CoffeeOrderIF extends java.rmi.Remote {

    public Coffee [] getPriceList()

        throws java.rmi.RemoteException;

    public String orderCoffee(String name, int quantity)

        throws java.rmi.RemoteException;

}

 

public class CoffeeOrderImpl implements CoffeeOrderIF {

    public Coffee [] getPriceList() {

        ...

    }

    public String orderCoffee(String name, int quantity) {

        ...

   }

}

 

这个例子是直接从我们Web Services Tutorial里面拷贝的。

如果有元数据功能的话,你就不必要手工写所有的这些东西。你只要标记代码让工具知道那些代码是可以远程访问的,工具就会自动生成上面的代码。下面是一个有元数据功能支持的代码的例子:

 

import javax.xml.rpc.*;

 

public class CoffeeOrder {

    @Remote public Coffee [] getPriceList() {

        ...

    }

    @Remote public String orderCoffee(String name, int quantity) {

        ...

    }

}

 

所有的样本文件都没有了!

 

嗯,确实简洁多了。但是您不可能定义所有有用的性质并且构造所有的工具,不是吗?

 

对,JSR-175只是提供了一个框架给其他的开发者,让他们可以定义性质和构造工具。其他一些JSR诸如JSR-181定义了Web Services 的元数据,是定义属性的。我们期望这个领域有更多的发展。

 

向前看,您期望未来的Java语言会有什么新的改变?

 

这个不好说。我现在所有的精力都花在Tiger上面了,没有时间考虑下一个变化是什么。

 

您还想留给我们一些其他什么信息吗?

 

其他最重要的就是,Tiger 是一个以开发者为中心的版本。当James Gosling 和他的团队引入Java语言之后,Java的发展速度就像是一个起飞的火箭一样,原因就在于它触动了开发者的心灵,点燃了他们的热情。这个版本的开发依然是基于这个思想。

我很幸运能有机会最早接触这些语言的新特性,发现用它们工作是一种乐趣。我敢确信其他开发者也会这样。在现有的各种开发语言中,Java本来就是一个非常好用而且富有生产力的语言,而所有的即将到来的新特性又会大大地增强使用它的乐趣,提高使用它进行开发的生产力。

Hibernate5总结及新特性

1. 明确Hibernate是一个实现了ORM思想的框架,它封装了JDBC,是程序员可以用对象编程思想来操作数据库。 2. 明确ORM(对象关系映射)是一种思想,JPA(Java Persistenc...
  • elementf
  • elementf
  • 2017年06月09日 14:13
  • 433

hibernate5(1)新特性展示

在hibernate5中,有了一些新的变动: - 新引导 API - Spatial/GIS 支持 - Java 8 支持 - 扩展 AUTO id 生成支持 - 命名策略分离 - 属性转...
  • qwe6112071
  • qwe6112071
  • 2016年03月30日 01:02
  • 9356

elasticsearch-query-builder, 一款可以基于配置化以及参数绑定的ES语句构造神器

前言 在这里,我想向大家推荐一个我自己开发的项目,也就是elasticsearch-query-builder,这个项目目前在github上已经开源,有兴趣的朋友可以去fork或者star,你的...
  • xiaowei1118
  • xiaowei1118
  • 2017年12月12日 17:56
  • 52

Spring 5 新功能:函数式 Web 框架

就像在昨天Juergen发布的博客的一样,Spring 5.0框架第二个里程碑版本中介绍了一个新的函数式web框架。在这篇文章中,我将更详细的介绍这个框架。 紧记该函数式web框架是在Spr...
  • ejinxian
  • ejinxian
  • 2016年10月08日 11:07
  • 6651

JDK5至JDK8的新特性

JDK各个版本的新特性   对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语...
  • lc0817
  • lc0817
  • 2015年09月03日 16:43
  • 2129

java基础知识---jdk5新特性

Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性。 -------------------...
  • Happy_wu
  • Happy_wu
  • 2016年06月02日 20:36
  • 1222

java5、java6、java7、java8的新特性

Java5: 1、泛型 Generics:         引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。         Parame...
  • samjustin1
  • samjustin1
  • 2016年08月21日 16:36
  • 12435

HTML5和CSS3新特性一览

HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 定义页面独立的内容区域。 定义页面的侧边栏内容。 ...
  • chandoudeyuyi
  • chandoudeyuyi
  • 2017年04月04日 20:53
  • 3109

面试必知的java8新特性-stream

面试必知的java8新特性-stream java作为开发语言中的元老已经度过了很多年,最新的java8为我们带来了一些新特性,这些特性可以在以后的工作中为我们的开发提供更多...
  • agzhchren
  • agzhchren
  • 2016年12月17日 22:35
  • 777

Extjs5.0新特性

http://docs.sencha.com/ext/5.0.0/whats_new/5.0/whats_new.html 用google简单翻译了 不是专业人士,不喜勿喷。    我们很...
  • xingjing315
  • xingjing315
  • 2014年07月01日 15:27
  • 1851
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(5)(完)
举报原因:
原因补充:

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