Annotation Type 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