局部变量需要最终声明
我收到错误“局部变量框从内部类访问;需要声明为最终”。这似乎是正确的,但我并不认为这是最好的解决方案,所以我希望也许有人能帮助我。这里是我的代码:局部变量需要最终声明
public void showPublisherBox(JComboBox box) {
if (publisherBox == null) {
publisherBox = new AddPublisherForm();
publisherBox.setLocationRelativeTo(this);
}
publisherBox.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
this.populatePublishers(box);
}
private void populatePublishers(JComboBox box){
box.setModel(db.getPublishers());
}
});
publisherBox.setVisible(true);
}
发布形式就是这样打开了,并采取了一些信息的新的JFrame,并在关闭时我想的JComboBox通过从我db.getPublishers设置模型重新填充()方法。
那么,有没有更好的方式来做我在这里做的事情,或者我将不得不声明最终的东西?
谢谢
既然你不是在外部编码修改box
,使用final
正是解决这一问题的正确方式。这是对自己(和编译器)的承诺,box
的值在封闭范围内不会更改。编译器会告诉你,如果你违反了这个承诺。
使用final
没有编译时或运行时成本。
没有。在这种情况下,宣布为最终。无论如何,参考文献不会改变。
本地类使用的局部变量必须声明为final。在这种情况下,变量是一个方法参数,你不会分配给它,所以我没有理由不把它声明为final。
不用说,此声明对方法的调用者无任何影响。它只说明引用的本地拷贝未被方法主体修改。
当一个匿名内部类(如您的WindowAdapter
)引用封闭范围内的变量(如'box')时,Java要求将它们声明为final
。以避免申报box
为final
将让你WindowAdapter
一个名为类
的一种方式,即接受box
的构造函数的参数:
public void showPublisherBox(JComboBox box) {
if (publisherBox == null) {
publisherBox = new AddPublisherForm();
publisherBox.setLocationRelativeTo(this);
}
publisherBox.addWindowListener(new MyWindowClosingHandler(box, db));
publisherBox.setVisible(true);
}
// ...
class MyWindowClosingHandler extends WindowAdapter {
private JComboBox box;
MyWindowClosingHandler(JComboBox box, DB db) {
this.box = box;
this.db = db;
}
public void windowClosing(WindowEvent we) {
populatePublishers();
}
private void populatePublishers(){
box.setModel(db.getPublishers());
}
});
}
你应该输入“决赛“每次你声明一个变量 - 我不知道为什么Java没有做出最终的默认值,并需要一个”变量“关键字或相反。我只是说大部分变量应该是最终的,除非另有证明。也就是说,您可以始终创建一个完整的类而不是匿名的内部类,并将该变量传递给构造函数 - 这将是“正确”的方法。匿名内部类无论如何都是坏习惯 - 它们阻碍了代码的重用(内部类不能在另一个地方作为一个监听器使用,而如果它是一个完整的类,它很容易被重用 - 我在重构时使用了这种技术以消除大量的冗余代码
+1我同意你的第一段,当涉及到局部变量或方法的参数 – 2011-08-29 01:34:47