Groovy 构造器(构造方法)

对象通过类的构造方法进行实例化,如果没有明确的给出一个构造方法,那么编译使用一个无参数的默认构造方法,这是在 java 中就出现了的,由于在 groovy 中,因此增加了一些额外可用的特性也不意外。

在 7.12 节我们比较了命名参数和位置参数的有点,可选参数也是需要的,相同的参数的方法调用也适用与构造方法,groovy 也提供了相同的便利机制,我们将首先看看位置参数的构造方法,然后再看看命名参数的构造方法。

位置参数

到目前,我们仅仅使用了隐式构造方法,列表 7.9 介绍了第一个显示构造方法,注意这很像其他所有的方法,构造方法默认是 public 的,我们能够通过三种途径调用构造方法:常用的 java 方式,使用 as 关键字进行强制造型和使用隐式造型。

在(1)和(2)的地方也许会让你感到很意外,当 groovy 看到需要将一个列表造型成别的类型的时候,它试图使用列表的所有元素作为参数来调用该类型的构造方法,按照列表的顺序进行。这在使用 as 关键字进行造型或者通过赋值来进行静态类型引用的时候是需要的。

我们后面讨论这些叫做隐式构建。

命名参数

命名参数在构造方法中是方便的,这在创建一个不可修改的类实例,而这个类有些可选参数的时候很有用,使用位置参数很快就变得很笨拙,因为你必须考虑到构造方法所有的可选参数。

作为一个例子,假如列表 7.9 的 Vendor With Ctor 应该不可变并且 nam e 和 product 能够是可选的,我们需要 4 个构造方法:一个没有参数,一个有 nam e 参数,一个有 product 参数,最后一个有 name 和 product 两个参数,事情变得更糟糕的是,我们没有唯一一个只有一个参数的构造方法,由于我们不能区别是否设置 name 还是 product 属性(他们两个都是 字符串类型),我们需要一个额外的参数来进行区别,或者我们需要强类型参数(译者注:在声明参数的时候指明参数的类型)。

不要恐慌:groovy 专门提供了命名参数的支持来救援。

列表 7.10 显示了在 Vendor 类的一个简化版本中使用命名参数。它依赖隐式的默认构造方法,不是十分容易吗?

在列表 7.10 的例子中介绍了怎样为你的构造方法使用灵活的命名参数,如果你不想要这种灵活性并且想锁定所有的参数,仅仅需要明确定义你需要的构造方法;隐式的命名构造方法将不再有效。

回到我们这节是如何开始的,默认无参数构造方法调用(new Vendor)的出现是不重要的,虽然它实际上看起来与 jav a 等价,命名参数的默认无参数构造方法被调用时没有提供任何参数。

隐式构造方法 最后,通过简单的提供构造方法的参数列表来隐式的调用构造方法,这意味着已经显式的调用了 Dimension(w idth,height)构造方法,例如,你能够这样使用:[code]java.awt.Dimension area area = [200, 100]
assert area.width == 200

assert area.height == 100
[/code]当然,groovy 必须知道调用什么构造方法,因此,通过类相应的构造方法来静态的分配类型引用是可用的,这对抽象类和接口是不工作的。

隐式构造方法经常用来作为 build er,正如你将在 8.5.7 中看到的 Sw ingBu ilder 那样。

这就是常用类的成员,这是我们能建立的稳定的基础,但是我们仍然没有在顶峰;我们有四个级别要走,我们通过怎样组织类和脚本的主题来到达高级面向对象特性的级别,它们的基层是命名的 GroovyBean 和涉及到的关于对象的简单 OO 信息,在这个级别,我们能用 groovy 强大的特性来做事,最后,我们将访问到最高级别,这就是在 groovy 中的元数据编 程——制作完全动态的环境,通过一种非常奇怪的途径来进行相应的方法调用和属性引用。