2012-01-14 52 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是最終的。