2012-01-14 3 views
1

Я создал этот графический интерфейс для одного моего приложения. В методе override actionPerformed Мне нужно вставить final для строки command, потому что эта переменная используется во внутреннем классе. Есть ли способ избежать этой проблемы?избегать использования конечной переменной String

@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

В чем проблема? Нужно набрать «final»? :) Не могли бы вы уточнить? –

+3

Ваш код не подтверждает [SSCCE] (http://sscce.org/). – Lion

+1

Вам не следует создавать новый экземпляр «Thread» для того, что вы пытаетесь сделать, но вместо этого используйте «SwingWorker» (или называете свой «emptyTextField» на EDT). Кроме того, чтение значения текстовых полей в вашем потоке должно также происходить на EDT. И, наконец, закрытие ваших потоков должно произойти в блоке 'finally' – Robin

ответ

1

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

3

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

class ThreadTask implements Runnable { 
    private String command; 

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

    public void run { 
     // 
    } 
} 

Он также делает код более удобочитаемым ИМО.

+0

Согласитесь, хотя я сказал, что это невозможно –

1

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

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

Смежные вопросы