groovy.transform.builder

## Class InitializerStrategy

- java.lang.Object
- - org.codehaus.groovy.transform.BuilderASTTransformation.AbstractBuilderStrategy
  - - groovy.transform.builder.InitializerStrategy

- All Implemented Interfaces:
    BuilderASTTransformation.BuilderStrategy

      public class InitializerStrategy
      extends BuilderASTTransformation.AbstractBuilderStrategy

  This strategy is used with the `Builder` AST transform to create a builder helper class for the fluent and type-safe creation of instances of a specified class. It is modelled roughly on the design outlined here: http://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/ You define classes which use the type-safe initializer pattern as follows:

       import groovy.transform.builder.*
       import groovy.transform.*

       @ToString
       @Builder(builderStrategy=InitializerStrategy) class Person {
           String firstName
           String lastName
           int age
       }

  While it isn't required to do so, the benefit of this builder strategy comes in conjunction with static type-checking or static compilation. Typical usage is as follows:

       @CompileStatic
       def main() {
           println new Person(Person.createInitializer().firstName("John").lastName("Smith").age(21))
       }

  which prints:

       Person(John, Smith, 21)

  If you don't initialise some of the properties, your code won't compile, e.g. if the method body above was changed to this:

       println new Person(Person.createInitializer().firstName("John").lastName("Smith"))

  then the following compile-time error would result:

       [Static type checking] - Cannot find matching method Person#(Person$PersonInitializer ). Please check if the declared type is right and if the method exists.

  The message is a little cryptic, but it is basically the static compiler telling us that the third parameter, `age` in our case, is unset.
  Author:
    Paul King

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static class` | `InitializerStrategy.SET` Internal phantom type used by the `InitializerStrategy` to indicate that a property has been set.
    `static class` | `InitializerStrategy.UNSET` Internal phantom type used by the `InitializerStrategy` to indicate that a property remains unset.

    - ### Nested classes/interfaces inherited from class org.codehaus.groovy.transform.BuilderASTTransformation.AbstractBuilderStrategy

      `BuilderASTTransformation.AbstractBuilderStrategy.PropertyInfo`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `InitializerStrategy()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `build(BuilderASTTransformation transform, AnnotatedNode annotatedNode, AnnotationNode anno)`

    - ### Methods inherited from class org.codehaus.groovy.transform.BuilderASTTransformation.AbstractBuilderStrategy

      `checkKnownField, checkKnownProperty, getIncludeExclude, getPropertyInfoFromClassNode, getSetterName, unsupportedAttribute, unsupportedAttribute`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### InitializerStrategy

          public InitializerStrategy()

  - ### Method Detail

    - #### build

          public void build(BuilderASTTransformation transform,
                   AnnotatedNode annotatedNode,
                   AnnotationNode anno)