避免使用最终的String变量

时间:2012-01-14 17:46:52

标签: java swing variables actionlistener final

我为我的应用程序创建了这个GUI。在覆盖方法actionPerformed中我必须为字符串final插入command,因为此变量用于内部类。有办法避免这个问题吗?

@Override
public void actionPerformed(ActionEvent e)
{
    final String command = e.getActionCommand();

    if(command.equals("add"))
    {
        new Thread(new Runnable(){

            @Override
            public void run()
            {
                // ... code skipped ... //
                ous.writeObject(command);
                // ... code skipped ... //
            }
        }).start();
    }

    else if(command.equals("remove"))
    {
        new Thread(new Runnable(){

            @Override
            public void run()
            {
                // ... code skipped ... //
                ous.writeObject(command);
                // ... code skipped ... //
            }
        }).start();
    }
}

我试图解决声明

的问题
String command = null;

在代码的开头。

3 个答案:

答案 0 :(得分:3)

您可以创建一个实现Runnable的单独类,在构造函数中传递String并使用该对象创建线程。像:

class ThreadTask implements Runnable {
    private String command;

    public ThreadTask(String command) {
        this.command = command;
    }

    public void run {
       //
    }
}

它还使代码更具可读性IMO。

答案 1 :(得分:1)

不,这是java中的一个功能。这是其“封闭”实施的一个限制。关闭变量必须是最终的。

答案 2 :(得分:1)

首先,你的内部类中不需要command:当你创建一个实例时,你肯定知道command的值,所以你也可以使用实际价值。

话虽如此,我会在适当的非匿名类中提取显然重复的代码,并将其传递给command。这也会改变设计,以便你可以不再担心command是最终的。