Groovy 重写操作符实战

列表3.1演示了Money类的equals(==)和plus(+)操作符的实现,这是值对象模式(参考http://c2.com/cgi/wiki?ValueObject)一个低级别的实现,这允许相同货币构成的Money可以相加,而不同货币构成的Money不能相加。

实现equals的目的是保证这个对象可以与null对象进行对比。这是groovy风格,equals操作的缺省实现是不抛出NullPointerException,记住:“==”或者equals指示对象是否同等(值相等),而不是是否指向同一个对象。

重写的equals是易懂的,就像(1)显示的那样,例子代码也提供了一个hashCode 方法用来保证等值的Money对象有相同的hashCode。(3)显示了这个操作符的用法。

在(2)处,plus操作符严格上说没有重写,因为在Money的父类(Object)上没有任何操作符,在这个例子里,操作符实现是最佳的说法,在(4)处使用这个操作符将两个Money对象进行相加。

为了解释重写和重载的区别,这里可能为Money的plus操作符进行了重载,在列表3.1,Money仅仅能和另外一个Money对象相加,在例子中,我们像这样加Money:assert buck + 1 == new Money(2, 'USD')我们能提供一个另外的方法Money plus (Intege r more) { return new Money(amount + more, currency) }这是第二个实现方法,这个方法接受一个Integer类型的参数,这个plus方法是重载的,groovy在运行时根据方法的实现进行正确的方法分派。

注意:在这两个例子中,Money的plus操作都返回Money对象,这样的操作叫Money的plus操作,这是在封闭的类型中进行的,无论在Money实例上执行什么操作,都是得到一个Money实例的结果。

这个例子说明了在实现一个操作符方法的时候怎么样处理不同的参数类型的问题。