为什么匿名类中只能由final常量? | Java Debug 笔记

本文正在参加「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
喜欢就支持一下吧
点赞0 分享