Este artículo es una traducción del documento Memoization in Groovy, escrito por Brendon Anderson en el blog de Object Partners. Deseo mostrar mi más sincero agradecimiento tanto al autor por escribir un artículo tan práctico y sencillo como a Ehren J. Seim por responder afirmativamente a mi petición para realizar la traducción del documento a español, y así difundir el conocimiento a la comunidad hispana de Groovy.
This article is a translation of the document Memoization in Groovy, written by Brendon Anderson in Object Partners's corporate blog. I wish to express my sincere thanks to the original author for write such a practical and easy-to-read article, as well as Ehren J. Seim for accept the spanish translation request and thus spread the word to the Groovy hispanic community.
Thanks a lot guys :)
¿Qué es Memoization?
Memoization (que aunque no es directamente traducible a español representa un concepto similar a memorización) es una forma de cacheo disponible en Groovy. Según su artículo original en Wikipedia (entre otros sitios) memoization es una técnica muy útil al realizar cálculos recursivos, aunque puede ser usando en cualquier situación en la que sea necesario almacenar cálculos previos basados en una entrada específica. Es importante hacer constar que memoization debe ser usado de forma distinta a como usamos un cacheo regular (en el contexto de Spring Cache, por ejemplo). Este último generalmente implica que, o los datos expirarán eventualmente, o simplemente cambiarán en el algún momento futuro, mientras que memoization está dirigido hacia cosas que siempre van a ser verdad (en otras palabras, datos que no van a cambiar). 5! (factorial de 5) va a ser siempre 120, mientras que el resultado de una llamada a un sistema remoto para obtener información de un usuario basado en un identificador (como idUsuario) podría cambiar. Groovy proporciona memoization en closures desde la versión 1.8. La capacidad de realizar memoization directamente sobre métodos ha sido añadida recientemente, más concretamente en la versión 2.2. Mirando el código fuente vemos que memoization en métodos usa la ya citada capacidad existente en closures; básicamente, la anotación @Memoized
envuelve en un closure la llamada al método donde es aplicado.
Memoization en closures
En el siguiente código se muestra un ejemplo básico de memoization en closures: