java 匿名类 优缺点_Java匿名类与Objective-C块相比的局限性

Java匿名类真的非常罗嗦.除了需要定义它们的大量样板外,Java的一些设计决策意味着许多常见任务比其他语言更冗长.例如,将可变的upvalues导入到闭包中是Java中的一个难题.

基本上,Java不支持upvalues;相反,他们通过将它们(通过值)传递给类,通过类的构造函数的不可见参数进行模拟.因为它们是通过值传递的,所以在类中修改它们不会影响构造类的方法中的副本,因此编译器会让你将它们声明为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;

}

}

}

在这里,我本身仍然是不可变的,但因为它指向一个可变对象,我可以改变对象的内容. (当然,在现实生活中我会使用类而不是数组,因为使用数组真的很难看.这使得它更加冗长.)

我认为下一个Java版本将具有语法糖,使这一切变得更容易,但是现在以封闭为中心的编程在Java中非常麻烦.我发现更改逻辑不使用闭包通常更容易,只是为了让我能够将使用的代码量保持在足够小的范围内以便于理解.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值