在发现 Objective-C 中的 block 后,我才开始关注一阶函数和闭包。 Java 是另一种我听说过闭包(或没有闭包)以及匿名类如何在某种程度上弥补这一点的语言。
在 Objective-C 中我绝对可以看到闭包作为 block 的优势,但是匿名 Java 类的局限性是什么?它们在多大程度上“有点”弥补了真正闭包的不足?
最佳答案
Java 匿名类真的非常冗长。除了定义它们所需的大量样板之外,Java 的一些设计决策意味着许多常见任务比其他语言要冗长得多。例如,将可变上值导入闭包是 Java 中的一个难题。
基本上,Java 不支持上值;相反,它们是通过将它们(按值)通过不可见参数传递给类的构造函数来模拟的。因为它们是按值传递的,所以在类内部修改它们不会影响构造类的方法中的副本,因此编译器让您将它们声明为 final 以避免混淆自己。例如:
Runnable function()
{
final int i = 4;
return new Runnable()
{
public void run()
{
System.out.println("i="+i);
// can't modify i here
}
}
}
在您确实需要修改变量的情况下,例如在闭包有用的几乎所有情况下,您必须作弊:
Runnable function()
{
final int[] i = new int[1];
i[0] = 4;
return new Runnable()
{
public void run()
{
System.out.println("i="+i[0]);
i[0] = i[0] + 1;
}
}
}
这里,i
本身仍然是不可变的,但是因为它指向一个可变对象,所以我可以改变对象的内容。 (自然地,在现实生活中我会使用类而不是数组,因为使用数组真的很难看。这使得它甚至更罗嗦。)
我了解到下一个 Java 版本将有语法糖来使这一切变得更容易,但现在以闭包为中心的编程在 Java 中非常麻烦。我发现更改逻辑而不使用闭包通常更容易,只是为了让我使用的代码量足够小以便于理解。
关于java - 与 Objective-C block 相比,Java 匿名类的局限性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6192542/