Objective C阻止Java等价物

时间:2012-04-03 14:45:20

标签: java objective-c-blocks

Apple Objective-C语言的一个特性对我来说非常有用:我可以将代码块作为方法中的参数传递。

我也想用Java做到这一点。 类似的东西:

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

因此myManager对象将在startTransaction()和endTransaction()方法之间执行我的代码。

有没有办法在Java中获得它?

4 个答案:

答案 0 :(得分:41)

不幸的是,Java不支持这一点。但是你可以使用匿名类获得类似的功能。

为此,首先要定义一个界面:

interface TransactionAction {
    public void perform();
}
然后应该定义

doSomethingInTransactionTransactionAction作为参数。

然后,当你打电话时,请执行以下操作:

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

答案 1 :(得分:12)

在Java中还没有这个(尚未)。解决方法是使用Runnable接口:

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

或任何具有单一方法的界面都可以。

答案 2 :(得分:3)

你可以使用像

这样的界面
interface CodeBlock {
    void execute();
}

该功能看起来像

someType functionToBeExecuted(CodeBlock cb) {
    ...
}

它会被称为

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

但是如果你的代码应该能够访问变量或字段将更加专业化。由于新对象,性能也会降低。

答案 3 :(得分:2)

现在可以在Java 8中使用lambda表达式:

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

或更简洁:

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

doSomethingInTransaction的实现应该接受Runnable参数或具有匹配方法签名的任何其他单方法接口。

您可以在此处找到Oracle的文档:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html