引言
Groovy是一门运行在Java虚拟机上的语言,语言特性与Java很类似,又有所区别,既可以利用JDK中丰富的API,由有自己独特之处。我们熟悉的应用场景之一就是在CI工具Jenkins中编写集成脚本。这篇文章就从类型的角度来分享一下Groovy与Java的一些不同之处,供您参考。
动态类型
Groovy是动态强类型语言。静态类型语言的一个特点是编译时的类型检查,比如Java和C++语言。动态类型则可以把类型检查推迟到运行时。所谓类型的强弱,是指在运行时是否能及时发现类型错误。
比如C++,如果把一个变量强制转换为一个错误类型,编译器会并不会阻止,而在运行时是否出错、以及什么时候出现则不一定。根据内存如何配置,调用是否多态,虚函数表如何组织等不同条件,最终表现也很难预测。这就是“弱”类型语言的表现。从这个意义来讲,Java和Groovy是强类型语言,可以在运行时找出错误的类型转换。
Groovy还是一种动态类型语言,可以不在编译时做类型检查,也可以动态修改程序结构,这给Groovy提供了足够的灵活性,以实现一些强大的功能,比如元编程能力。下图展示了类型的强弱与动态静态之间的关系。
能力式设计
由于Groovy语言具有动态性,在使用它进行程序设计时也与Java有所不同。
比如接口的设计,使用Java语言时我们通常采用契约式设计,即使用接口定义一组操作作为契约,凡是实现这个接口的类都要履行接口的契约,完成对指定方法的实现。这样做的好处是,我们不关心某一个类型是否是另一个类型(大象是否是一个动物,男人是否是人类,机器人是否是工人,等等),只关心它是否实现了某个接口定义的功能。
契约式设计的局限性是,我们在使用接口提供的功能时,要明确指定接口类型,即调用者依赖接口定义,比如:
interface Worker {
public void work();
}
class Robot implements Worker {
public void