@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:@IndexedPropertyFieldType[] someField@IndexedPropertyListotherField @IndexedPropertyList 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]