本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
此文章为stackoverflow问题翻译,原问题:stackoverflow.com/questions/4…
问题概述
1.
a
在这里只能是final。为什么?我如何能重定义a
在onClick()方法中,并且不用保证他是一个private的成员变量?
private void f(Button b, final int a){
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int b = a*5;
}
});
}
复制代码
2.
我如何能在在点击后返回5 * a
?
private void f(Button b, final int a){
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int b = a*5;
return b; // but return type is void
}
});
}
复制代码
最高赞回答
如注释中所述,其中一些在Java 8中变得无关紧要,而final可以是隐式的。但是,匿名内部类或lambda表达式中只能用有效的final变量。
这基本上是由于Java管理闭包的方式。
创建匿名内部类的实例时,该类中使用的任何变量都将通过自动生成的构造函数复制其值。他避免了编译器不得不自动生成各种额外的类型来保存“局部变量”的逻辑状态,比如C#编辑器中(当C#在匿名函数中捕获变量时,它实际上捕获了变量-闭包可以以方法主体可以看到的方式更新变量,反之亦然。)
由于该值已被复制到匿名内部类的实例中,因此如果变量的其余部分可以被该方法的其余部分修改,则看起来会很奇怪-您可能会发现代码似乎与过时的变量一起使用(因为这实际上是将要发生的事情……您将使用在不同时间拍摄的副本)。同样,如果您可以在匿名内部类中进行更改,则开发人员可能希望这些更改在封闭方法的正文中可见。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END