为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在匿名类中只能访问最终变量?

为什么在匿名类中只能访问最终变量?

为什么在匿名类中只能访问最终变量?a只能在这里决赛。为什么?如何a在onClick()不将其保留为私有成员的情况下重新分配方法?private void f(Button b, final int a){     b.addClickHandler(new ClickHandler() {         @Override         public void onClick(ClickEvent event) {             int b = a*5;         }     });}如何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          }     });}
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

有一个技巧允许匿名类更新外部作用域中的数据。

private void f(Button b, final int a) {
    final int[] res = new int[1];
    b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            res[0] = a * 5;
        }
    });

    // But at this point handler is most likely not executed yet!
    // How should we now res[0] is ready?}

但是,由于同步问题,这个技巧不是很好。如果稍后调用handler,则需要1)如果从不同的线程调用处理程序,则同步对res的访问2)需要有某种标志或指示res已更新

但是,如果在同一个线程中立即调用匿名类,这个技巧就可以了。喜欢:

// ...final int[] res = new int[1];Runnable r = new Runnable() { public void run() { res[0] = 123; } };r.run();System.out.println(res[0]);// ...


查看完整回答
反对 回复 2019-05-27
?
Helenr

TA贡献1780条经验 获得超4个赞

匿名类是内部类,严格规则适用于内部类 (JLS 8.1.3)

使用但未在内部类中声明的任何局部变量,形式方法参数或异常处理程序参数必须声明为final。任何在内部类中使用但未声明的局部变量必须在内部类的主体之前明确赋值

我还没有找到关于jls或jvms的原因或解释,但我们知道,编译器为每个内部类创建一个单独的类文件,并且必须确保在此类文件上声明的方法(在字节代码级别上)至少可以访问局部变量的值。

Jon有完整的答案 - 我保留这个未删除的,因为有人可能对JLS规则感兴趣)


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 821 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信