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]