IndexedProperty (Groovy 2.4.10)
Date: 2017-03-14

groovy.transform

## Annotation Type IndexedProperty

-     @Documented
       @Retention(value=SOURCE)
       @Target(value=FIELD)
      public @interface IndexedProperty

  Field annotation used with properties to provide an indexed getter and setter for the property. Groovy provides nice GPath syntax support for accessing indexed properties but Java tools or frameworks may expect the JavaBean style setters and getters.

  Example usage: suppose you have a class with the following properties:

        @IndexedProperty FieldType[] someField
        @IndexedProperty List otherField
        @IndexedProperty List furtherField

  will add the following methods to the class containing the properties:

       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]

  Since:
    1.7.3
  Author:
    Paul King