是否可以避免将对象声明为final?

时间:2014-03-21 18:14:37

标签: java

我在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;
            }
        }
    });

4 个答案:

答案 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));
}