In Groovy we can define properties in our class and automatically the getter and setter methods for these properties are generated in the class file. If we have a Collection type property we normally get the get/set method for this property. But according to the JavaBean specification we can define a Collection type property as indexed property. This means we need an extra get/set method with an index parameter, so we can set the value of a element in the property directly:
//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[])
Normally if we use our class in Groovy code we don't need those extra methods, because we can GPath to access and set elements in the Collection typed property. But suppose our class needs to be accessed from Java code or by an IDE, we want those extra methods. We only have to add the @IndexedProperty
annotation to our property and we get the extra getter and setter methods we want:
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]