我在ChangeListener
的构造函数中向JTabbedPane
添加了JFrame
。在stateChanged
方法中,我有一个方法,其中包含我在构造函数中收到的参数,但它必须是final
。有可能避免这种情况吗?
public PerfilPaciente(int operation, Patient patient) {
tabPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
switch (tabPane.getSelectedIndex()) {
case 1:
loadDates(patient); // here is the problem
break;
}
}
});
答案 0 :(得分:7)
在匿名类中使用的Java 7(包括)变量需要明确最终。在你的情况下:
public PerfilPaciente(int operation, final Patient patient) {
使用Java 8不再需要这个变量,变量只需要有效最终(即在封闭方法中永远不会重新分配)。因此,使用Java 8,您的代码将被编译。
答案 1 :(得分:1)
为避免这种情况,您可以创建一个包含要处理的信息的内部类
public class MyOutterClass {
...
public PerfilPaciente(int operation, Patient patient) {
tabPane.addChangeListener(new MyChangeListener(patient));
}
...
//use an inner class that implements the interface
//instead of an anonymous class declaration
private class MyChangeListener implements ChangeListener {
Patient patient;
public MyChangeListener(Patient patient){
this.patient= patient;
}
@Override
public void stateChanged(ChangeEvent e) {
switch (tabPane.getSelectedIndex()) {
case 1:
loadDates(patient); // here is the problem
break;
}
}
}
}
答案 2 :(得分:0)
我无法完全理解你不想让它成为最终版的原因,但你可以复制一下这个变量:
final Patient patientFinal = patient;
然后
loadDates(patientFinal);
答案 3 :(得分:0)
有一种方法可以避免它 - 声明新类MyChangeListener扩展ChangeListener(像@Sam这样的代码),但我怀疑它更优雅。无论如何,患者实际上是最终的,并且明确地进行决赛是一种很好的做法。
public PerfilPaciente(int operation, Patient patient) {
tabPane.addChangeListener(new MyChangeListener(patient));
}