Groovy 创建索引属性Getter和Setter方法

  • 2019 年 10 月 4 日
  • 笔记

在Groovy中,我们可以在类中定义属性,并自动在类文件中生成这些属性的getter和setter方法。 如果我们有一个Collection类型属性,我们通常会获得此属性的get/set方法。 但是根据JavaBean规范,我们可以将Collection类型属性定义为索引属性。 这意味着我们需要一个带索引参数的额外get/set方法,因此我们可以直接在属性中设置元素的值:

//Methods to access individual values  public PropertyElement getPropertyName(int index)  public void setPropertyName(int index, PropertyElement element)    /Methods to access the entire indexed property array  public PropertyElement[] getPropertyName()  public void setPropertyName(PropertyElement element[])

通常,如果我们在Groovy代码中使用我们的类,我们不需要那些额外的方法,因为我们可以通过GPath来访问和设置Collection类型属性中的元素。 但是假设我们的类需要从Java代码或IDE访问,我们需要这些额外的方法。 我们只需要将@IndexedProperty注释添加到我们的属性中,我们就可以得到我们想要的额外的getter和setter方法:

import groovy.transform.IndexedProperty    class Group {      String name      List members = []  }    class IndexedGroup {      String name      @IndexedProperty List members = []  }    def group = new Group(name: 'Groovy')  group.members[0] = 'mrhaki'  group.members[1] = 'Hubert'  assert 2 == group.members.size()  assert ['mrhaki', 'Hubert'] == group.members    try {      group.setMembers(0, 'hubert') // Not index property  } catch (MissingMethodException e) {      assert e  }    def indexedGroup = new IndexedGroup(name: 'Grails')  indexedGroup.members[0] = 'mrhaki'  indexedGroup.setMembers 1, 'Hubert'  assert 2 == indexedGroup.members.size()  assert 'mrhaki' == indexedGroup.getMembers(0)  assert 'Hubert' == indexedGroup.members[1]