我一直在为 iOS 编写代码,我对 Objective-C 中的块概念非常熟悉。现在,我倾向于将 Java 用于 Android,并尝试将一些应用程序从 Android 转换为 iOS。
我读到在 Java 中没有完美的块等价物,所以我想知道实现完成处理程序或任何可以类似工作的东西的最佳替代方案是什么。
我一直在为 iOS 编写代码,我对 Objective-C 中的块概念非常熟悉。现在,我倾向于将 Java 用于 Android,并尝试将一些应用程序从 Android 转换为 iOS。
我读到在 Java 中没有完美的块等价物,所以我想知道实现完成处理程序或任何可以类似工作的东西的最佳替代方案是什么。
接口类型,一般。如果您的处理程序没有参数和返回类型,您可以按照 Rob 的建议使用Runnable
(这是一个)。但是定义你自己的很简单:interface
void
interface CompletionHandler {
public void handle(String reason);
}
然后将其传递给您自己的班级:
something.setCompletionHandler(new CompletionHandler() {
@Override
public void handle(String reason) {
...
}
});
在另一个班级:
void setCompletionHandler(CompletionHandler h) {
savedHandler = h;
}
然后通过调用方法来调用它:
savedHandler.handle("Some mysterious reason");
这种事情是为 Java Swing 和 Android 库中的“侦听器”做的。见 View.OnClickListener
,例如。
(PS 我相信 Java 8 lambdas 将可用于所有这些接口示例。)
你可以做runnables。显然,块的等价物将需要 Java 8 中的 lambda,但谁知道 Android 支持它们多久(他们仍在使用 JUnit 3.8)。
Android中有很多地方可以像块一样完成事情,例如:
this.currentConditionsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
currentConditionsActivity.onLocationChanged(...);
}
});
instrumentation.waitForIdleSync();
setupViewElements();
如您所见,您必须创建一个匿名类的实例,但在大多数 IDE 中,样板的愚蠢性通过自动填充得到缓解。这是在 Android Studio 中完成的,它在执行 new Runnable() 之后将整个内容放入其中(如果您折叠代码,它甚至会显示类似于 lambdas 的语法)。
所以这就是现在的状态。没有很多人认为的那么糟糕……