【问题标题】:Java - Use of non final variables in anonymous inner class?Java - 在匿名内部类中使用非最终变量?
【发布时间】:2015-12-07 14:49:34
【问题描述】:

在学校测试中,我在匿名内部类中使用了非最终变量。 在学校计算机和我的私人计算机上(使用 x86 jre1.8.0_45)它正在工作。

但是,在老师的笔记本电脑上 Eclipse 显示错误(变量应该使用 final)。他使用的是jre1.8.0.x版本(不知道具体版本)。

任何想法为什么它在我的计算机上运行而不是在他的计算机上运行?

在此代码示例中,在 ActionListener 的 actionPerformed 函数中使用了 no final 对象 jLabel:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;

public class Main {
    public Main(String[] args) {
        JLabel jLabel = new JLabel();
        JButton button = new JButton();
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                jLabel.setText("xyz");

            }
        });
    }
}

【问题讨论】:

标签: java


【解决方案1】:

较新的 java 版本在这个问题上更宽容:它们只要求它们应该是“有效的最终版本”。

最后,区别并不大——你只能使用你可以用final标记的变量;你不能修改它们。

如果你在那个地方,你也可以让他们“真正地”final,它在任何地方都有效。

顺便说一句,在 1.8 上,您可以使用新的 lambda 语法更优雅地编写

button.addActionListener((ActionEvent arg0) -> jLabel.setText("xyz"));

【讨论】:

  • 更具体地说,“有效最终”是从 Java 1.8 引入的...在以前的版本中,它必须声明为最终版本。
  • @Codebender 我也这么认为,但 OP 似乎也在 1.8 版本上观察到了这种“旧”行为——如果他没记错的话......
  • “较新”是相对的。 7 及以上版本是 EoPU,已过时,不应再使用。
【解决方案2】:

您可以不将 Listener 定义为匿名类,而是将其定义为私有内部类以避免该问题:

public class Main {

    public Main(String[] args) {

        JLabel jLabel = new JLabel();
        JButton button = new JButton();
        button.addActionListener(new MyActionListener(jLabel));
    }

    private class MyActionListener implements ActionListener {

        private JLabel jLabel;
        MyActionListener(JLabel jLabel) {
            this.jLabel = jLabel;
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            jLabel.setText("xyz");            
        }

    }
}

这样,您只需将标签(和按钮,如果需要)传递给侦听器的构造函数,就可以毫无问题地使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多