2011-05-01 118 views
4

我收到错误“局部变量框从内部类访问;需要声明为最终”。这似乎是正确的,但我并不认为这是最好的解决方案,所以我希望也许有人能帮助我。这里是我的代码:局部变量需要最终声明

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设置模型重新填充()方法。

那么,有没有更好的方式来做我在这里做的事情,或者我将不得不声明最终的东西?

谢谢

回答

8

既然你不是在外部编码修改box,使用final正是解决这一问题的正确方式。这是对自己(和编译器)的承诺,box的值在封闭范围内不会更改。编译器会告诉你,如果你违反了这个承诺。

使用final没有编译时或运行时成本。

1

没有。在这种情况下,宣布为最终。无论如何,参考文献不会改变。

1

本地类使用的局部变量必须声明为final。在这种情况下,变量是一个方法参数,你不会分配给它,所以我没有理由不把它声明为final。

不用说,此声明对方法的调用者无任何影响。它只说明引用的本地拷贝未被方法主体修改。

4

当一个匿名内部类(如您的WindowAdapter)引用封闭范围内的变量(如'box')时,Java要求将它们声明为final。以避免申报boxfinal将让你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()); 
    } 
}); 

}

0

你应该输入“决赛“每次你声明一个变量 - 我不知道为什么Java没有做出最终的默认值,并需要一个”变量“关键字或相反。我只是说大部分变量应该是最终的,除非另有证明。也就是说,您可以始终创建一个完整的类而不是匿名的内部类,并将该变量传递给构造函数 - 这将是“正确”的方法。匿名内部类无论如何都是坏习惯 - 它们阻碍了代码的重用(内部类不能在另一个地方作为一个监听器使用,而如果它是一个完整的类,它很容易被重用 - 我在重构时使用了这种技术以消除大量的冗余代码

+0

+1我同意你的第一段,当涉及到局部变量或方法的参数 – 2011-08-29 01:34:47