Mientras Java en su versión 7.0, parece que puede por fin adoptar un mecanismo claro de Closures, hay ciertos patrones de diseño que pueden ayudarnos.
Para comenzar, dejaremos claro que nuestro objetivo: Poder insertar un bloque de código puntual, específico y variable entre el código que define una función ya existente.
Para entender mejor esta declaración, lo mejor es definir un ejemplo.
Partimos de una función que realiza una transacción de base de datos mediante JPA:public Object update(Object entity)
{
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.merge(entity);
transaction.commit();
return entity;
}
El problema viene cuando queremos completar el envío de un mensaje dentro de la misma transacción, es decir, que si el envió falla, queremos que la transacción global se interrumpa. Por supuesto, el código asociado al envío del mensaje es variable y puede ser totalmente distinto para cada ejecución.
Este escenario plantea un grave problema, ya que no podemos "inyectar" el código que queremos dentro de la función "update" debido a que cada vez es distinto y además no podemos pasar funciones anónimas como parámetros como en JavaScript (closures).
Para solucionar esta situación, podemos diseñar un intefaz común que describa la función anónima que nos gustaría poder pasar como parámetro. Por ejemplo:
public interface EventSender<T>
{
public void dispatch(T entity) throws Exception;
}
A continuación, modificaremos la función "update" para que pueda recibir una instancia de esta interfaz como parámetro. A partir de este momento tendremos que usar "generics" en esta función para que el parámetro del procedimiento "dispatch" pueda adoptar cualquier tipo:
public <T> T update(T entity, EventSender<T> eventSender) throws Exception
{
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.merge(entity);
eventSender.dispatch(entity);
transaction.commit();
return entity;
}
Por último, sólo tenemos que modificar la llamada al método "update" para poder empezar a pasarle el código de envío de mensajes que creamos oportuno en cada caso:
this.baseDAO.update(document, new EventSender<Document>() {
public void dispatch(Document entity) throws Exception
{
// codigo asociado el envío que quiero realizar
}
});




