簡體   English   中英

ObjectiveC阻止Java等價物

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM