Package groovy.transform

# Annotation Interface Memoized

@Documented @Retention(SOURCE) @Target(METHOD) public @interface Memoized
Method annotation that creates a cache for the results of the execution of the annotated method. Whenever the method is called, the mapping between the parameters and the return value is preserved in a cache making subsequent calls with the same arguments fast.

Example usage:

     class MemoizedExample {

         @Memoized
         int sum(int n1, int n2) {
             println "$n1 + $n2 = ${n1 + n2}"
             n1 + n2
         }
     }

which becomes (approximately):

     class MemoizedExample {

         private final Closure memoizedSum = { int n1, int n2 ->
             private$method$memoizedSum(n1,n2)
         }.memoize()

         int sum(int n1, int n2) {
             memoizedSum(n1, n2)
         }

         private private$method$memoizedSum(int n1, int n2) {
             println "$n1 + $n2 = ${n1 + n2}"
             n1 + n2
         }
     }

Upon execution of this code:

     def instance = new MemoizedExample()
     println instance.sum(1, 2)
     println instance.sum(1, 2)
     println instance.sum(2, 3)
     println instance.sum(2, 3)

The following will be output:

     1 + 2 = 3
     3
     3
     2 + 3 = 5
     5
     5

More examples:

     import groovy.transform.*

     // Script variable which is changed when increment()
     // method is invoked.
     // If cached method call is invoked then the value
     // of this variable will not change.
     @Field boolean incrementChange = false

     @Memoized
     int increment(int value) {
         incrementChange = true
         value + 1
     }

     // Invoke increment with argument 10.
     increment(10)

     // increment is invoked so incrementChange is true.
     assert incrementChange

     // Set incrementChange back to false.
     incrementChange = false

     // Invoke increment with argument 10.
     increment(10)

     // Now the cached method is used and
     // incrementChange is not changed.
     assert !incrementChange

     // Invoke increment with other argument value.
     increment(11)

     // increment is invoked so incrementChange is true.
     assert incrementChange

Since:
  2.2.0

- ## Optional Element Summary

  Optional Elements
  Modifier and Type
  Optional Element
  Description
  `int`
  `maxCacheSize`
  The maximum size the cache can grow to.
  `int`
  `protectedCacheSize`
  Number of cached return values to protect from garbage collection.

- ## Element Details

  - ### protectedCacheSize

    int protectedCacheSize
    Number of cached return values to protect from garbage collection.
    Default:
      0

  - ### maxCacheSize

    int maxCacheSize
    The maximum size the cache can grow to.
    Default:
      0