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 Detail

      • 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