избегать использования последней строковой переменной - PullRequest
1 голос
/ 14 января 2012

Я создал этот 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 ]

3 голосов
/ 14 января 2012

Вы можете создать отдельный класс, который реализует Runnable, передать String в конструктор и использовать этот объект для создания вашего потока.Как:

class ThreadTask implements Runnable {
    private String command;

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

    public void run {
       //
    }
}

Это также делает код более читабельным IMO.

1 голос
/ 14 января 2012

Прежде всего, вам не нужно command во внутренних классах: к моменту создания экземпляра вы точно знаете значение command, так что вы также можете использовать фактическое значение.

Сказав это, я извлекла бы, по-видимому, повторяющийся код в надлежащий неанонимный класс и передала ему правильный command.Это также изменило бы дизайн настолько, что вы могли бы перестать беспокоиться о том, что command будет окончательным.

1 голос
/ 14 января 2012

Нет, это функция в Java.Это ограничение в реализации «замыкания».Переменные закрытия должны быть окончательными.

...