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

实战 Groovy: @Delegate 注释

 2009-09-28 00:00:00 来源:WEB开发网   
核心提示: 清单 14. 测试极端情况classFixedListTestextendsGroovyTestCase{voidtestNegativeSize(){ListbadList=newFixedList(-1)shouldFail(java.lang.UnsupportedOperationExc

清单 14. 测试极端情况

class FixedListTest extends GroovyTestCase{
  void testNegativeSize(){
    List badList = new FixedList(-1)
    shouldFail(java.lang.UnsupportedOperationException){
      badList << "will this work?"
    }    
  }
}

测试将一个元素插入到列表中间的情况

现在,您已经确信这个简单的重写过的 add() 方法可以正常工作,下一步是实现重载的 add() 方法,可以获取索引以及元素,如清单 15 所示:

清单 15. 使用索引添加元素

class FixedList{
  @Delegate private List list = new ArrayList()
  final int sizeLimit
   
  void add(int index, Object element){
    list.add(index, element)
    trimToSize()
  }
  
  private void trimToSize(){
    if(list.size() > sizeLimit){
      (sizeLimit..<list.size()).each{
        list.pop()
      }
    }
  }
}

注意,您可以(也应该)在任何可能的情况下使用 delegate 自带的功能 — 毕竟,这正是您优先选择 delegate 的原因。在这种情况下,您将让 ArrayList 执行添加操作,并去掉任何超出 FixedList 的大小的元素。(这个 add() 方法是否应该像另一个 add() 方法那样抛出一个 UnsupportedOperationException,您可以自己做出这个设计决策)。

trimToSize() 方法包含了一些值得关注的语法糖。首先,pop() 方法是由 Groovy 元编程到所有 List 中的内容。它删除了 List 中的最后一个元素,使用后进先出(last-in first-out,LIFO)的方式。

上一页  5 6 7 8 9 10 

Tags:实战 Groovy Delegate

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