java - 与 Objective-C block 相比,Java 匿名类的局限性

标签 java objective-c closures block

在发现 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/

相关文章:

objective-c - 如何将自定义 View 单元格置于 NSTableView 中的表格行上方?

python - 与语言 X 闭包相比,Python 中的闭包有哪些限制?

Javascript臭名昭著的循环问题?

java - 忽略 jackson I/O 序列化中的字段并忽略未知字段

JAVA移动设备-本地存储数据

ios - Mapbox中的错误:只有工厂方法可以具有'swift_name'属性

ios - UICollectionView 崩溃

java - 在 Linux 64 位上用 Java 监视文件

Java 输入流子流。是否可以?

Javascript:请解释以下代码