gpt4 book ai didi

java - Swing 和最终修饰符

转载 作者:搜寻专家 更新时间:2023-10-31 08:11:18 24 4
gpt4 key购买 nike

为什么 SWING 总是强制我将某些特定对象标记为最终对象?由于这有时会使事情变得有点困难,有没有办法避免这种情况?

(不完整的示例)迫使我将 IExchangeSource 变量标记为最终变量:

public class MainFrame {

private final JTextArea textArea = new JTextArea();


public static void main(final IExchangeSource s) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new MainFrame(s);
}
});
}
public MainFrame(final IExchangeSource s) {
//build gui
s.update();

最佳答案

这与 Swing 没有关系,完全没有关系。你应该展示你的代码有一个这样的例子,但你可能正在使用一个内部类,可能是一个匿名内部类,如果你使用这些并尝试在内部类中使用局部于封闭方法的变量(或其他 block ,例如构造函数),则需要将这些变量设为最终变量或将它们提升为类字段。同样,这是 Java 要求,而不是 Swing 要求。

Swing 示例:

public MyConstructor() {
final int localIntVar = 3; // this must be final

myJButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// because you use the local variable inside of an anon inner class
// not because this is a Swing application
System.out.println("localIntVar is " + localIntVar);
}
});
}

和一个非 Swing 示例:

public void myMethod() {
final String foo = "Hello"; // again it must be final if used in
// an anon inner class

new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(foo);
try {
Thread.sleep(1000);
} catch (Exception e) {}

}
}
}).start();
}

有几个技巧可以避免这种情况:

  • 将变量提升为类字段,赋予它类作用域。
  • 让匿名内部类调用外部类的方法。但是,变量仍然需要具有类作用域。

编辑 2Anthony Accioly 发布了一个带有很好链接的答案,但随后出于未知原因删除了他的答案。我想在这里发布他的链接,但希望看到他重新打开他的答案。

Cannot refer to a non-final variable inside an inner class defined in a different method

关于java - Swing 和最终修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com