2012-01-14 17 views
1

オーバーライドされたメソッドの1つのアプリケーションに対して、このGUIを作成しましたactionPerformedcommandfinalを挿入する必要があります。この変数は内部クラスで使用されるためです。この問題を回避する方法はありますか?最終的な文字列変数の使用を避ける

@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'を使用するか、EDTで 'emptyTextField'を呼び出してください。さらに、スレッド内のテキストフィールドの値を読み取ることは、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 { 
     // 
    } 
} 

また、IMOのコードを読みやすくします。

+0

私はこれが不可能であった –

1

まず、内部クラスにcommandは必要ありません。インスタンスを作成するまでには、確かにcommandの値が分かるので、実際の値を使用することもできます。

私は、明らかに反復されたコードを適切な非匿名クラスで抽出し、適切なcommandを渡します。それは、あなたがcommandについて最終的な心配を止めることができるように、デザインを十分に変更するでしょう。

関連する問題