在发现Objective-C中的块之后,我才开始围绕一阶函数和闭包进行研究。 Java是我听说过闭包(或缺少闭包)以及匿名类在某种程度上如何弥补闭包的另一种语言。
我绝对可以在Objective-C中看到闭包作为块的优点,但是匿名Java类的局限性是什么?他们在多大程度上“弥补”了缺乏真正封闭的可能性?
最佳答案
Java匿名类确实非常罗word。除了定义它们所需的大量样板之外,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 - Java匿名类与Objective-C块相比的局限性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6192542/