![](/img/trans.png)
[英]Java - How am I accessing non final variables from an anonymous inner class?
[英]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.