站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(5)(完)

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

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

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />看起来真的很好。您乐意跟我们介绍一下静态导入(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本来就是一个非常好用而且富有生产力的语言,而所有的即将到来的新特性又会大大地增强使用它的乐趣,提高使用它进行开发的生产力。


作者Blog:http://blog.csdn.net/liuflei3139/


↑返回目录
前一篇: J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(3)
后一篇: J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(1)