[英]ObjectiveC blocks Java equivalent
Apple Objective-C語言的一個特性對我來說非常有用:我可以將代碼塊作為方法中的參數傳遞。
我也想用Java做到這一點。 就像是:
myManager.doSomethingInTransaction(function() {
dao.save();
});
因此myManager對象將在startTransaction()和endTransaction()方法之間執行我的代碼。
有沒有辦法在Java中獲得它?
不幸的是,Java不支持這一點。 但是您可以使用匿名類獲得類似的功能。
為此,首先定義一個接口:
interface TransactionAction {
public void perform();
}
然后應該定義doSomethingInTransaction
以將TransactionAction
作為參數。
然后,當你調用它時,執行以下操作:
myManager.doSomethingInTransaction(new TransactionAction() {
public void perform() {
dao.save();
}
});
這還不存在於Java(尚)中。 解決方法是使用Runnable
接口:
myManager.doSomethingInTransaction(new Runnable() {
public void run() {
dao.save();
}
});
或任何具有單一方法的界面都可以。
你可以使用像這樣的界面
interface CodeBlock {
void execute();
}
功能看起來像
someType functionToBeExecuted(CodeBlock cb) {
...
}
它會被稱為
functionToBeExecuted(new CodeBlock() {
void execute() {
// blah
}
});
但是,如果您的代碼應該能夠訪問變量或字段將更加專業化。 由於新對象,這種方式的性能也會降低。
現在可以在Java 8中使用lambda表達式:
myManager.doSomethingInTransaction(() -> {
dao.save();
});
或者更簡潔:
myManager.doSomethingInTransaction(() -> dao.save());
您的doSomethingInTransaction
實現應該接受Runnable
參數或具有匹配方法簽名的任何其他單方法接口。
您可以在此處找到Oracle的文檔: https : //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.