2012-04-03 37 views
16

Es gibt eine Funktion der Apple Objective-C-Sprache, die mir wirklich nützlich ist: Ich kann Code-Blöcke als Argument in Methoden übergeben.ObjectiveC-Blöcke Java-Äquivalent

Ich möchte das auch in Java tun. Etwas wie:

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

Also das MyManager Objekt wird meinen Code zwischen einem starttransaction() und einem endTransaction() Methoden auszuführen.

Gibt es eine Möglichkeit, das in Java zu bekommen?

+0

Die einfache Antwort ist „nein“, so da in Java keine Funktionalität ist. –

+0

Für 2014 scheint die Antwort zu lauten: "Benutze einfach ein Runnable". – Fattie

Antwort

40

Leider unterstützt Java dies nicht. Aber Sie können ähnliche Funktionen mit anonymen Klassen erhalten.

Dazu müssen Sie zunächst eine Schnittstelle definieren:

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction sollte dann eine TransactionAction als Argument nehmen definiert werden.

Dann, wenn Sie es nennen, dies zu tun:

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

Dieses Beispiel funktioniert nicht, da 'do' ein Schlüsselwort ist. – Landei

+0

Ja, das ist mir gerade aufgefallen. – Taymon

+0

Danke. Klarer kann das nicht sein! :) –

11

Nein, das nicht existiert in Java (noch) nicht. Eine Abhilfe besteht darin, die Runnable Schnittstelle zu verwenden:

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

oder jede Schnittstelle mit einer einzigen Methode tun wird.

+0

Dies ist die beste Lösung! –

3

Sie eine Schnittstelle wie

interface CodeBlock { 
    void execute(); 
} 

die Funktion aussehen würde es wie

genannt würden

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

können

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

Aber wenn Ihr Code sollte zugreifen können Variablen oder Felder in werden spezialisierter sein. Auch die Leistung wird aufgrund der neuen Objekte geringer sein.

2

Dies ist nun möglich in Java 8 einen Lambda-Ausdruck mit:

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

Oder mehr lapidar:

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

Ihre Implementierung von doSomethingInTransaction einen Runnable Parameter akzeptieren sollte, oder jede andere Single-Verfahren Schnittstelle mit einer passenden Methodensignatur.

Sie können hier Oracle Dokumentation: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

Dies könnte sogar zu 'myManager.doSomethingInTransaction (dao :: save);' vereinfacht werden – Palle