@Documented @Retention(value=SOURCE) @Target(value=FIELD) public @interface IndexedProperty
Example usage: suppose you have a class with the following properties:
will add the following methods to the class containing the properties:@IndexedProperty
FieldType[] someField@IndexedProperty
ListotherField @IndexedProperty
List furtherField
FieldType getSomeField(int index) { someField[index] } FieldType getOtherField(int index) { otherField[index] } Object getFurtherField(int index) { furtherField[index] } void setSomeField(int index, FieldType val) { someField[index] = val } void setOtherField(int index, FieldType val) { otherField[index] = val } void setFurtherField(int index, Object val) { furtherField[index] = val }Normal Groovy visibility rules for properties apply (i.e. no
public
, private
or package
visibility can be specified) or you will receive a compile-time error message.
The normal Groovy property getters and setters will also be created.
More examples:
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]