2012-01-14 74 views
1

我已经为一个我的应用程序创建了此GUI。在重写方法actionPerformed我必须为字符串command插入final,因为此变量用于内部类。有一种方法可以避免这个问题?避免使用最终的字符串变量

@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

会有什么问题?必须输入“最终”? :)你能否详细说明一下? – 2012-01-14 17:50:02

+3

您的代码未确认[SSCCE](http://sscce.org/)。 – Lion 2012-01-14 17:55:51

+1

您不应该为您正在尝试的操作创建一个新的'Thread'实例,而是使用'SwingWorker'(或在EDT上调用您的'emptyTextField')。此外,读取线程中文本字段的值也应在EDT上进行。最后,关闭你的流应该发生在'finally'块 – Robin 2012-01-14 18:08:29

回答

1

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

3

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

class ThreadTask implements Runnable { 
    private String command; 

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

    public void run { 
     // 
    } 
} 

它也使得代码更易读IMO。

+0

同意,即使我说这是不可能的 – 2012-01-15 02:47:32

1

首先,在内部类中不需要command:在创建实例时,您肯定知道command的值,因此您可以使用实际值。这样说的话,我会在适当的非匿名类中提取明显重复的代码,并将它传递给合适的command。这也会改变设计,以至于你不再担心command是最终的。