2012-04-03 26 views
16

Hay una característica del lenguaje Apple Objective-C que es realmente útil para mí: puedo pasar bloques de código como argumento en métodos.Bloques ObjectiveC equivalente en Java

Me gustaría hacer eso en Java, también. Algo así como:

myManager.doSomethingInTransaction(function() { 
    dao.save(); 
}); 

Por lo tanto el objeto myManager ejecutará el código entre un startTransaction() y un endTransaction() métodos.

¿Hay alguna manera de obtener eso en Java?

+0

La simple respuesta es "no", no hay ninguna funcionalidad como la de Java. –

+0

Para 2014, la respuesta parece ser "solo use un Runnable". – Fattie

Respuesta

40

Desafortunadamente, Java no es compatible con esto. Pero puede obtener una funcionalidad similar con clases anónimas.

Para ello, primero se define una interfaz:

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction debería definirse a tomar un TransactionAction como argumento.

Entonces, cuando usted lo llama, haga lo siguiente:

myManager.doSomethingInTransaction(new TransactionAction() { 
    public void perform() { 
     dao.save(); 
    } 
}); 
+1

Este ejemplo no funcionará ya que 'do' es una palabra clave. – Landei

+0

Sí, me acabo de dar cuenta de eso. – Taymon

+0

Gracias. ¡No puede ser más claro que esto! :) –

11

No, esto no existe en Java (todavía). Una solución es utilizar la interfaz Runnable:

myManager.doSomethingInTransaction(new Runnable() { 
    public void run() { 
     dao.save(); 
    } 
}); 

o cualquier interfaz con un único método va a hacer.

+0

¡Esta es la mejor solución! –

3

puede utilizar una interfaz como

interface CodeBlock { 
    void execute(); 
} 

la función se vería

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

sería llamado como

functionToBeExecuted(new CodeBlock() { 
    void execute() { 
     // blah 
    } 
}); 

Pero si el código debe ser capaz de acceder las variables o campos en serán más especializados. También el rendimiento será menor de esta manera debido a los nuevos objetos.

2

Ahora esto es posible en Java 8 utilizando una expresión lambda:

myManager.doSomethingInTransaction(() -> { 
    dao.save(); 
}); 

O más concisamente:

myManager.doSomethingInTransaction(() -> dao.save()); 

Su puesta en práctica de doSomethingInTransaction debe aceptar un parámetro Runnable, o cualquier otro método sencillo interfaz con una firma de método coincidente.

Puede encontrar documentación de Oracle aquí: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

Esto podría incluso simplificarse a 'myManager.doSomethingInTransaction (dao :: save);' – Palle