2012-04-03 7 views
16

Il y a une caractéristique du langage Apple Objective-C qui m'est vraiment utile: je peux passer des blocs de code comme argument dans les méthodes.ObjectiveC bloque l'équivalent Java

J'aimerais aussi le faire en Java. Quelque chose comme:

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

donc l'objet myManager exécutera mon code entre les méthodes startTransaction() et un endTransaction().

Existe-t-il un moyen d'obtenir cela en Java?

+0

La réponse est « non », il n'y a pas de fonctionnalité comme en Java. –

+0

Pour 2014, la réponse semble être "il suffit d'utiliser un Runnable". – Fattie

Répondre

40

Malheureusement, Java ne supporte pas cela. Mais vous pouvez obtenir des fonctionnalités similaires avec des classes anonymes.

Pour ce faire, vous définissez d'abord une interface:

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction devrait alors être défini pour prendre un TransactionAction comme argument.

Puis, quand vous l'appelez, faites ceci:

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

Cet exemple ne fonctionnera pas car 'do' est un mot-clé. – Landei

+0

Ouais, viens de le remarquer. – Taymon

+0

Merci. Ça ne peut pas être plus clair que ça! :) –

11

Non cela n'existe pas en Java (encore). Une solution consiste à utiliser l'interface Runnable:

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

ou d'une interface avec une seule méthode va faire.

+0

C'est la meilleure solution! –

3

vous pouvez utiliser une interface comme

interface CodeBlock { 
    void execute(); 
} 

la fonction ressemblerait

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

il serait appelé comme

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

Mais si votre code devrait être en mesure d'accéder les variables ou champs seront plus spécialisés. Les performances seront également plus faibles à cause des nouveaux objets.

2

Ceci est maintenant possible en Java 8 en utilisant une expression lambda:

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

Ou plus laconiquement:

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

Votre mise en œuvre de doSomethingInTransaction doit accepter un paramètre Runnable, ou tout autre méthode unique interface avec une signature de méthode correspondante.

Vous pouvez trouver la documentation d'Oracle ici: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

Cela pourrait même être simplifié à 'myManager.doSomethingInTransaction (dao :: save);' – Palle