domingo, 10 de enero de 2010

Java 7 Closures


Una noticia que hizo mucho ruido fue que en java 7 va a haber Closures, esto trae un poco de revuelo en el mundo java.
Ya que hasta ultimo momento no aceptaban Closures en la nueva versión del lenguaje.

Lo primero que hay que entender es la diferencia entre funciones como objetos y closures. Una función puede ser anónima o definida, pero también pueden ser objetos en si mismas. Esto nos permite utilizar funciones como argumentos, ser devueltas por otras funciones o ser almacenadas en estructuras de datos.
Vamos, son objetos de primera clase o de primer orden.
Un closure es una función más su entorno y estos pueden ser de igual forma tratados como objetos de primera clase, pero al contener un entorno, podemos acceder a variables (o funciones) de este entorno incluso cuando el mismo no este activo. Existen lenguajes que soportan funciones-objetos o closures o ambos, y muchos de los lenguajes funcionales en su mayoria utilizan funciones y funciones-closure.
Entonces, un closure, por ejemplo, nos permite definir una función que tiene acceso a una variable, así que podemos almacenar esta funcion en un objeto y acceder a ella. El contexto de la función no se limita sólo a los objetos a los que tiene acceso directo, pero también a las variables que obtiene vía el entorno.

Veamos un ejemplo clásico de sort con un método anónimo:

anArray.sort(new Comparator()
public int compare(MyClass a, MyClass b) {
return a.myProperty().compareTo(b.myProperty();
}
});


Con closures haríamos esto:

anArray.sort( (a, b) => a.myProperty().compareTo(b.myProperty()));

En lenguajes como Python llevan mucho tiempo discutiendo sobre la necesidad de lambda y la verdad es que IMO no son algo necesario, pero que es bueno tener a mano para cuando las circunstancias lo precisen.
Este tema es parecido al de los for-each con Java6 donde muchas personas desconfiaban de la implementación de estos y de su utilidad.
Como sucede con cualquier herramienta, es mejor entenderla antes de utilizarla para no terminar con código spaghetti que dificulte la lectura y el mantenimiento

Que les parece la noticia? Es positivo para java?

3 comentarios:

  1. Hace ya un tiempo también que .NET soporta expresiones lambda junto con LINQ. Está bueno tenerlo a mano para cuando es necesario, y no abusar y usarlo en todos lados.

    ResponderBorrar
  2. Si es verdad en .net las expresiones lambda están hace tiempo. .net tiene una velocidad de evolución mayor, esto tiene sus ventajas y desventajas.

    ResponderBorrar
  3. Todo suma. Es positivo. Uno nunca sabe cuando las puede llegar a necesitar.

    ResponderBorrar