簡體   English   中英

Java - 在匿名內部類中使用非最終變量?

[英]Java - Use of non final variables in anonymous inner class?

在學校測試中,我在anonyme內部類中使用了非final變量。 在學校計算機和我的私人計算機上(使用x86 jre1.8.0_45)它正在工作。

但是,在教師筆記本電腦Eclipse上顯示錯誤(變量應該使用final)。 他正在使用jre1.8.0.x版本(不知道具體版本)。

任何想法為什么它在我的電腦而不是他的電腦上工作?

在此代碼示例中,在ActionListener的actionPerformed函數中使用了無最終對象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版本在這個問題上更容忍:它們只要求它們應該“有效地最終”。

最后,差異並不大 - 你只能使用你final可以標記的變量; 你可能不會修改它們。

如果你在那個地方,你也可以讓它們“真正” final ,並且無處不在。

順便說一下,在1.8的新lambda語法中你可以寫得更優雅

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

您可以將監聽器定義為不是匿名類,而是將其定義為私有內部類以避免該問題:

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");            
        }

    }
}

這樣您就可以將標簽(和按鈕,如果需要)傳遞給偵聽器的構造函數,並且可以毫無問題地使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM