WEB开发网
开发学院软件开发Java 实战 Groovy: @Delegate 注释 阅读

实战 Groovy: @Delegate 注释

 2009-09-28 00:00:00 来源:WEB开发网   
核心提示: 清单 8. 多个 @Delegate 提供了多重继承的行为classRemoteFile{@DelegateFilefile@DelegateURLurl}如果 @Delegate 只能修改类的行为 — 而不是类型 — 这是否意味着对 Java 开发人员毫无价值?未必,即

清单 8. 多个 @Delegate 提供了多重继承的行为

class RemoteFile{
  @Delegate File file
  @Delegate URL url
}

如果 @Delegate 只能修改类的行为 — 而不是类型 — 这是否意味着对 Java 开发人员毫无价值?未必,即使是 Java 之类的静态类型语言也为 duck 类型提供了一种有限的形式,称为多态。

具有多态性的 duck

多态 — 该词源于希腊,用于描述 “多种形状” — 意味着只要一组类通过实现相同接口显式地共享相同的行为,它们就可以互相替换着使用。换句话说,如果定义了一个 Duck 类型的变量(假设 Duck 是一个正式定义 quack() 和 waddle() 方法的接口),那么可以将 new Mallard()、new GreenWingedTeal() 或者(我最喜爱的)new PekingWithHoisinSauce() 分配给它。

通过将 delegate 类的方法和接口全部提升到其他类,@Delegate 注释为多态提供了完整的支持。这意味着如果 delegate 类实现了接口,您又回到了为它创建一个临时替代这件事上来。

@Delegate 和 List 接口

假设您希望创建一个名为 FixedList 的新类。它的行为应该类似 java.util.ArrayList,但是有一个重要的区别:您应当能够为可以添加到其中的元素的数量定义一个上限。这允许您创建一个 sportsCar 变量,该变量可以容纳两个乘客,但是不能比这再多了,restaurantTable 可以容纳 4 个用餐者,但是同样不能超过这个数字,以此类推。

ArrayList 类实现 List 接口。它为您提供了两个选项。您也可以让您的 FixedList 类实现 List 接口,但是您需要面对一项烦人的工作:为所有 List 方法提供一个实现。由于 ArrayList 并不是 final 类,另一个选择就是让 FixedList 扩展 ArrayList。这是一个非常有效的做法,但是如果(假设)ArrayList 被声明为 final,@Delegate 注释将提供第三个选择:通过将 ArrayList 作为 FixedList 的委托,您可以获得 ArrayList 的所有行为,同时自动实现 List 接口。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:实战 Groovy Delegate

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接