2012-01-05 16 views
5

スウィングはなぜ特定のオブジェクトに最終的なマークを付けるのですか?これはときには物事を少し難しくするので、これを避ける方法はありますか?それは、最終的なようIExchangeSource変数をマークするために私を強制的にスイングと最終変更子

(INCOMPLETE例):

public class MainFrame { 

private final JTextArea textArea = new JTextArea(); 


public static void main(final IExchangeSource s) { 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      new MainFrame(s); 
     } 
    }); 
} 
public MainFrame(final IExchangeSource s) { 
    //build gui 
    s.update(); 
+3

例を挙げることができますか?匿名の内部クラスで周囲のメソッドから変数を使用することについて話していますか?変数を 'final'にすることを強制するSwing自体には何もないので。 – Jesper

+2

私はあなたが匿名の内部クラスを使用していると確信しています。 –

答えて

18

これは、Swing、全く何もして行うには何もを持っていません。その例を示すコードを表示する必要がありますが、内部クラス、おそらく匿名の内部クラスを使用している可能性があります。これらを使用し、内部クラス内の変数を囲むメソッドのローカルに使用しようとすると(またはコンストラクタなどの他のブロック)、これらの変数を最終的にするか、クラスフィールドに宣言する必要があります。これもJavaの要件であり、スウィングの要件ではありません。

スイング例:

public MyConstructor() { 
    final int localIntVar = 3; // this must be final 

    myJButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     // because you use the local variable inside of an anon inner class 
     // not because this is a Swing application 
     System.out.println("localIntVar is " + localIntVar); 
     } 
    }); 
} 

と非スイング例:

public void myMethod() { 
    final String foo = "Hello"; // again it must be final if used in 
           // an anon inner class 

    new Thread(new Runnable() { 
     public void run() { 
     for (int i = 0; i < 10; i++) { 
      System.out.println(foo); 
      try { 
      Thread.sleep(1000); 
      } catch (Exception e) {} 

     } 
     } 
    }).start(); 
} 

これを回避するために、いくつかのトリックがあります。

  • がクラスフィールドに変数を推進クラスのスコープを与えます。
  • 匿名の内部クラスに外部クラスのメソッドを呼び出させます。しかし、変数には依然としてクラススコープが必要です。

編集2 アンソニーAcciolyは偉大なリンクとその答えを掲載するが、その後、未知の理由のために彼の答えを削除しました。私はここに彼のリンクを掲示したいと思いますが、彼が彼の答えを再開するのが好きです。

Cannot refer to a non-final variable inside an inner class defined in a different method

+0

答えをありがとう、はい私は内部クラスを使用していた(例を参照)。初めてサンプルを追加しないと申し訳ありません。 – Cemre

+0

@Cemre:ソリューションの編集を参照してください。 –

+0

@Cemre、サンプルを投稿しなかったのはどういう意味ですか?過去にあなたの質問にSSCCEを投稿するように求められました。すべての質問にSSCCEを含める必要があります。 – camickr

関連する問題